[python] Zapis do pliku i bład

0

Witam, mam taki kod napisany w pythonie. W linijce zaznaczonej zwraca błąd. Dlaczego?

wynik = open('out.txt', 'w')
wynik.write('aaa\nbbb')
wynik.close()

plik = open('aaa.txt', 'r')
for line in plik.read().split('\n'):
        ok = 0;
        wynik = open('out.txt', 'r+')
        for l in wynik.read().split('\n'):
                if(line == l):
                        ok = 1
                        pass
        if(ok == 0):
                wynik.write("\nLinia dodana") # TUTAJ JEST BŁAD!!
        wynik.close()
plik.close()
0

A czy argument funkcji write() nie powinien się kończyć znakiem "\n" ?

0

Zmieniłem na:

wynik.write("Linia dodana\n")

i nadal jest ten sam błąd.

0

Wygląda, że podczas pisania do pliku musisz być na początku lub na końcu pliku.

wynik = open('out.txt', 'w')
wynik.write('aaa\nbbb')
wynik.close()

plik = open('kalk.py', 'r')
for line in plik.read().split('\n'):
        ok = 0;
        wynik = open('out.txt', 'r+')
        s=wynik.read()
        n=len(s)
        for l in s.split('\n'):
                if(line == l):
                        ok = 1
                        pass
        if(ok == 0):
                wynik.seek(n)
                wynik.write("\nLinia dodana")
        wynik.close()
plik.close()

Ten kod się wykonuje

0

Właśnie doczytałem jak się ustawić na końcu pliku:
fseek(k) ustawia względem początku
fseek(k,1) ustawia względem aktualnej pozycji
fseek(k,2) ustawia względem końca

wynik = open('out.txt', 'w')
wynik.write('aaa\nbbb')
wynik.close()

plik = open('kalk.py', 'r')
for line in plik.read().split('\n'):
        ok = 0;
        wynik = open('out.txt', 'r+')
        s=wynik.read()
        for l in s.split('\n'):
                if(line == l):
                        ok = 1
                        pass
if(ok == 0):
        wynik.seek(0,2)
        wynik.write("\nLinia dodana")
wynik.close()
plik.close()

Zmieniłem wcięcia aby wiersz "Linia dodana" pojawił sie tylko raz

0

Faktycznie musi być ten linia wynik.seek(0,2) bo inaczej nie działa ale w moim przypadku wcięcia muszą wyglądać tak:

wynik = open('out.txt', 'w')
wynik.write('aaa\nbbb')
wynik.close()

plik = open('kalk.py', 'r')
for line in plik.read().split('\n'):
        ok = 0;
        wynik = open('out.txt', 'r+')
        s=wynik.read()
        n=len(s)
        for l in s.split('\n'):
                if(line == l):
                        ok = 1
                        pass
        if(ok == 0):
                wynik.seek(0,2)
                wynik.write("\nLinia dodana")
        wynik.close()
plik.close()

Dzięki za pomoc.

0

Wybacz, ale w pracy muszę trochę douczać ludzi pythona i jestem w trybie nauczycielskim. Pozwolę sobie poprawić troszke Twój kod, tak jak to jest przyjęte w społeczności pythonowej.

wynik = open('out.txt', 'w')
wynik.write('aaa\nbbb')
wynik.close()

plik = open('kalk.py', 'r')
for line in plik: # zazwyczaj lepiej czytać po linijkach, zwłaszcza jak duży plik
    wynik = open('out.txt', 'r+')
    for l in wynik:
        if line == l:
            break
    else:
        wynik.seek(0,2)
        wynik.write("\nLinia dodana")
    wynik.close()
plik.close()

Jeżeli plik out.txt nie jest duży, to lepiej zrobić tak (szybsze wyszukiwanie w pamięci niż w pliku i mniej jeżdżenia po dysku):

wynik = open('out.txt', 'w')
wynik.write('aaa\nbbb')
wynik.close()

wynik = open('out.txt', 'r')
out_tab = [line.strip() for line in wynik]
wynik.close()

plik = open('kalk.py', 'r')
for line in plik:
    if line.strip() not in out_tab:
        out_tab.append("Linia dodana")
plik.close()

wynik = open('out.txt', 'w')
wynik.writelines([line + '\n' for line in out_tab])
wynik.close()

A w pythonie >= 2.5 można się pobawić nawet by to było ładne i bezpieczne (kod powyżej też powinien być zabezpieczony przez try..finally):

from __future__ import with_statement

with open('out.txt', 'w') as wynik:
    wynik.write('aaa\nbbb')

with open('out.txt', 'r') as wynik:
    out_tab = [line.strip() for line in wynik]

with open('kalk.py', 'r') as plik:
    for line in plik:
        if line.strip() not in out_tab:
            out_tab.append("Linia dodana")

with open('out.txt', 'w') as wynik:
    wynik.writelines([line + '\n' for line in out_tab])

Cieszę się, że przybywa nam nowy pythonista. Owocnego kodowania!

1 użytkowników online, w tym zalogowanych: 0, gości: 1