import csv
import os
import copy
from os import listdir
from os.path import isfile, join
from fractions import gcd
def skroc(x):
z = gcd(x[0], x[1])
return [x[0]/z, x[1]/z]
def wartosc(x):
if x[1] == 0:
return x[0]*float("inf")
else:
return x[0]*1.0/x[1]
def mnoz(a, b):
return skroc([a[0]*b[0], a[1]*b[1]])
def dziel(a, b):
if b[0] == 0:
return None
else:
return skroc([a[0]*b[1], a[1]*b[0]])
def dodaj(a, b):
return skroc([a[0]*b[1]+b[0]*a[1], a[1]*b[1]])
def odejmij(a, b):
return skroc([a[0]*b[1]-b[0]*a[1], a[1]*b[1]])
def RedukcjaGaussa(a):
A = copy.deepcopy(a)
n = len(A)
if n == 0:
return A
m = len(A[0])
if m == 0:
return A
# Krok 1
warunek0 = True
for i in range(0, n):
if A[i][0][0] != 0:
warunek0 = False
break
if warunek0:
# Krok 2
if m == 1:
return A
else:
B = []
for i in range(0, n):
rzad = []
for j in range(1, m):
rzad.append(skroc(A[i][j]))
B.append(rzad)
B = RedukcjaGaussa(B)
C = []
for i in range(0, n):
rzad = [[0, 1]]
for j in range(1, m):
rzad.append(skroc(B[i][j-1]))
C.append(rzad)
return C
# Krok 3
if A[0][0][0] == 0:
# Krok 4
iMin = 0
for i in range(0, n):
if wartosc(A[i][0]) != 0:
iMin = i
break
A[0], A[iMin] = A[iMin], A[0]
# Krok 5
for j in range(1, n):
for x in range(0, m):
A[j][x] = odejmij(A[j][x], mnoz(dziel(A[j][0], A[0][0]), A[0][x]))
# Krok 6
D = []
D.append([A[0][0]])
for i in range(1, n):
D.append([[0, 1]])
if m == 0:
return D
else:
E = copy.deepcopy(A)
E.pop(0)
for i in range(0, len(E)):
E[i].pop(0)
F = RedukcjaGaussa(E)
for j in range(1, m):
D[0].append(A[0][j])
for i in range (1, n):
for j in range (1, m):
D[i].append(F[i-1][j-1])
return D
def macierzNaCsv(A):
csv = []
for i in range(0, len(A)):
rzad = []
for j in range(0, len(A[i])):
for x in range(0, 2):
rzad.append(A[i][j][x])
csv.append(rzad)
return csv
files = [f for f in listdir('.') if isfile(f) and f[:4].lower() == "dane"]
for f in files:
macierz = []
B = []
with open(f, 'r') as file:
reader = csv.reader(file)
for row in reader:
rzad = []
for m in range(0,len(row),2):
rzad.append(skroc([int(row[m]), int(row[m+1])]))
macierz.append(rzad)
B = RedukcjaGaussa(macierz)
with open(f, 'wb') as file:
writer = csv.writer(file)
writer.writerows(macierzNaCsv(B))
Co mogę zmieć w tym kodzie, żeby działał on poprawnie?
Zwraca mi błąd:
File "redukcjagaussa.py", line 137, in <module>
writer.writerows(macierzNaCsv(B))
TypeError: a bytes-like object is required, not 'str'
Niestety nie mam już pomysłów na doprowadzenie tego do ładu...