Jak dołączyć do pliku w Pythonie?

W jaki sposób dołączasz do pliku zamiast go nadpisywać? Czy istnieje jakaś specjalna funkcja, która dołącza do pliku?

Rozwiązanie
with open("test.txt", "a") as myfile:
    myfile.write("appended text")
Komentarze (16)

Musisz otworzyć plik w trybie dołączania, ustawiając "a" lub "ab" jako tryb. Zobacz open().

Kiedy otwierasz z trybem "a", pozycja zapisu będzie zawsze na końcu pliku (append). Możesz otworzyć z "a+", aby umożliwić czytanie, szukanie wstecz i czytanie (ale wszystkie zapisy nadal będą na końcu pliku!).

Przykład:

>>> with open('test1','wb') as f:
        f.write('test')
>>> with open('test1','ab') as f:
        f.write('koko')
>>> with open('test1','rb') as f:
        f.read()
'testkoko'

Uwaga: Użycie 'a' nie jest tożsame z otwarciem z 'w' i szukaniem do końca pliku - zastanów się, co mogłoby się stać, gdyby inny program otworzył plik i zaczął pisać pomiędzy szukaniem a zapisem. W niektórych systemach operacyjnych otwarcie pliku za pomocą 'a' gwarantuje, że wszystkie kolejne zapisy będą dołączane atomowo do końca pliku (nawet jeśli plik rozrasta się o kolejne zapisy).


Kilka więcej szczegółów o tym jak działa tryb "a" (testowane tylko na Linuksie). Nawet jeśli szukasz wstecz, każdy zapis będzie dołączany do końca pliku:

>>> f = open('test','a+') # Not using 'with' just to simplify the example REPL session
>>> f.write('hi')
>>> f.seek(0)
>>> f.read()
'hi'
>>> f.seek(0)
>>> f.write('bye') # Will still append despite the seek(0)!
>>> f.seek(0)
>>> f.read()
'hibye'

W rzeczywistości, fopen manpage stwierdza:

Otwarcie pliku w trybie append (a jako pierwszy znak trybu) powoduje, że wszystkie kolejne operacje zapisu do tego strumienia będą miały miejsce na końcu pliku, tak jakby poprzedzało je wywołanie:

fseek(stream, 0, SEEK_END);


Stara uproszczona odpowiedź (nie używając with):

Przykład: (w prawdziwym programie używaj with do zamknięcia pliku - patrz dokumentacja)

>>> open("test","wb").write("test")
>>> open("test","a+b").write("koko")
>>> open("test","rb").read()
'testkoko'
Komentarze (3)

Prawdopodobnie chcesz przekazać "a" jako argument trybu. Zobacz docs dla open().

with open("foo", "a") as f:
    f.write("cool beans...")

Istnieją inne permutacje argumentu mode dla trybu aktualizującego (+), obcinającego (w) i binarnego (b), ale zaczynanie od "a" jest najlepszym rozwiązaniem.

Komentarze (2)