Jak dołączyć do pliku w Pythonie?


1573

Jak dołączyć do pliku zamiast go zastąpić? Czy istnieje specjalna funkcja dołączana do pliku?

Odpowiedzi:


2448
with open("test.txt", "a") as myfile:
    myfile.write("appended text")

10
Może to być również przydatne z samouczka.
Dan

28
Zauważyłem, że wiele osób korzysta z tej with open(file, "a")metody. Jestem może staroświecki, ale jaka jest przewaga nadopen(file, "a") ... file.close()

75
bluewoodtree: Korzyści są podobne do korzyści z RAII w C ++. Jeśli zapomnisz close (), może minąć trochę czasu, zanim plik zostanie faktycznie zamknięty. Łatwiej jest zapomnieć o tym, gdy kod ma wiele punktów wyjścia, wyjątków i tak dalej.
Petter

54
print("appended text", file=myfile)jest również możliwe dla bardziej znanego API.
Thomas Ahle,

6
@Tom: no. open()nie koduje na stałe utf-8. Używa locale.getpreferredencoding(False). Przekaż encoding="utf-8"parametr jawnie, jeśli wiesz, że plik używa kodowania utf-8.
jfs

206

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

Po otwarciu w trybie „a” pozycja zapisu zawsze będzie znajdować się na końcu pliku (dodatek). Możesz otworzyć za pomocą „+”, aby umożliwić czytanie, szukać wstecz i czytać (ale wszystkie zapisy będą nadal 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żywanie „a” nie jest tym samym, co otwieranie za pomocą „w” i szukanie do końca pliku - zastanów się, co może się stać, jeśli inny program otworzy plik i zacznie pisać między wyszukiwaniem a zapisem. W niektórych systemach operacyjnych otwarcie pliku za pomocą „a” gwarantuje, że wszystkie kolejne zapisy zostaną dodane atomowo na końcu pliku (nawet gdy plik rośnie w wyniku innych zapisów).


Kilka dodatkowych szczegółów na temat działania trybu „a” ( testowane tylko w systemie Linux ). Nawet jeśli będziesz szukać wstecz, każdy zapis będzie dołączany na końcu 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 podręcznika stwierdza:

Otwarcie pliku w trybie dołączania (a jako pierwszy znak trybu) powoduje, że wszystkie kolejne operacje zapisu do tego strumienia mają miejsce na końcu pliku, tak jakby poprzedzał wywołanie:

fseek(stream, 0, SEEK_END);

Stara uproszczona odpowiedź (nieużywana with):

Przykład: ( w prawdziwym programie użyj withdo zamknięcia pliku - patrz dokumentacja )

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

3
nie potrzebujesz close()?
Jonas Stein

9
@JonasStein, powinieneś użyć with- patrz docs.python.org/2/whatsnew/2.6.html#pep-343-the-with-statement
sinelaw

użyj „test.txt” zamiast po prostu „test”, jeśli piszesz do pliku tekstowego w systemie Windows.
ambassallo,

Zastanawiam się, kiedy mój plik zakończy zapisywanie w innym momencie, ale nie na końcu pliku?
Iqra.

48

Zawsze to robię

f = open('filename.txt', 'a')
f.write("stuff")
f.close()

To proste, ale bardzo przydatne.


12
jest trochę ładniejszy i trochę bezpieczniejszy do napisania: z otwartym („nazwa pliku”, „a”) jako f: f.write („rzeczy”)
Sam Redway

2
„a +” jest lepsze niż „a”
dell pk

6
Jest to mniej proste niż większość odpowiedzi opublikowanych kilka lat przed tym i nie jest bardziej przydatne
Tim

2
@Tim Castelijns Fajnie, że ktoś opublikował alternatywę dla składni z, której nie zawsze możesz chcieć użyć, jeśli używasz zmiennej w wielu lokalizacjach.
bagno

2
@marsh Nawet jeśli przekazujesz fzmienną do innych funkcji, ta sama funkcja, która otwiera plik, powinna go zamknąć. withSkładnia jest preferowanym sposobem do osiągnięcia tego celu.
Andrew Palmer,

35

Prawdopodobnie chcesz przekazać "a"jako argument trybu. Zobacz dokumentację open () .

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

Istnieją inne kombinacje argumentu mode dla trybu aktualizacji (+), obcinania (w) i binarnego (b), ale rozpoczęcie od właśnie "a"jest najlepszym wyborem.


20
filerzuca cień na wbudowaną funkcję. Nie używaj go do zmiennych.
Mark Tolonen,

11
@MarkTolonen: filenie jest już wbudowany w Python 3. Nawet w Python 2 jest używany bardzo rzadko . Otwieranie pliku jest częstą operacją. Można filetutaj używać nazwy zarówno w Pythonie 2, jak i 3. Wiedzieć, kiedy być niespójnym.
jfs

34

Python ma wiele odmian poza głównymi trzema trybami, te trzy tryby to:

'w'   write text
'r'   read text
'a'   append text

Tak więc dodanie do pliku jest tak proste, jak:

f = open('filename.txt', 'a') 
f.write('whatever you want to write here (in append mode) here.')

Są też tryby, które po prostu zmniejszają liczbę wierszy kodu:

'r+'  read + write text
'w+'  read + write text
'a+'  append + read text

Wreszcie istnieją tryby odczytu / zapisu w formacie binarnym:

'rb'  read binary
'wb'  write binary
'ab'  append binary
'rb+' read + write binary
'wb+' read + write binary
'ab+' append + read binary

14

gdy korzystamy z tego wiersza open(filename, "a"), który aoznacza dołączenie pliku, oznacza to, że pozwala na wstawienie dodatkowych danych do istniejącego pliku.

Możesz po prostu użyć poniższych wierszy, aby dodać tekst w pliku

def FileSave(filename,content):
    with open(filename, "a") as myfile:
        myfile.write(content)

FileSave("test.txt","test1 \n")
FileSave("test.txt","test2 \n")

9

Można również zrobić to printzamiast write:

with open('test.txt', 'a') as f:
    print('appended text', file=f)

Jeśli test.txt nie istnieje, zostanie utworzony ...


1
To zasługuje na więcej entuzjastów! Jest to najprostszy sposób na prawidłowe dołączenie linii końcowych bez dodatkowej logiki.
Przemysław Czechowski

Możesz również mieć flagę WRITE_TO_FILE = open('my_file.txt', mode='a'), a następnie podczas swojego programu możesz mieć kilka wydruków takich print('Hello world', file=WRITE_TO_FILE), a kiedy tylko zdecydujesz się zobaczyć wyjście na konsoli, po prostu zmień flagę na WRITE_TO_FILE = None. Nie zapomnij zamknąć pliku na końcu, jeśli nie jestNone
Alaa M.

6

Możesz także otworzyć plik w r+trybie, a następnie ustawić pozycję pliku na końcu pliku.

import os

with open('text.txt', 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

Otwarcie pliku w r+trybie pozwoli Ci napisać do innych pozycjach plików oprócz końcu, podczas ai a+siła pisania do końca.


4

jeśli chcesz dołączyć do pliku

with open("test.txt", "a") as myfile:
    myfile.write("append me")

Zadeklarowaliśmy zmienną, myfileaby otworzyć plik o nazwie test.txt. Otwórz przyjmuje 2 argumenty, plik, który chcemy otworzyć, oraz ciąg znaków reprezentujący rodzaje uprawnień lub operacji, które chcemy wykonać na pliku

oto opcje trybu pliku

Tryb Opis

„r” To jest tryb domyślny. Otwiera plik do odczytu.
„w” Ten tryb Otwiera plik do zapisu. 
Jeśli plik nie istnieje, tworzy nowy plik.
Jeśli plik istnieje, obcina plik.
„x” Tworzy nowy plik. Jeśli plik już istnieje, operacja nie powiedzie się.
„a” Otwórz plik w trybie dołączania. 
Jeśli plik nie istnieje, tworzy nowy plik.
„t” To jest tryb domyślny. Otwiera się w trybie tekstowym.
„b” Otwiera się w trybie binarnym.
„+” Spowoduje to otwarcie pliku do odczytu i zapisu (aktualizacja)

4

W 'a'oznacza parametr trybie dopisywania. Jeśli nie chcesz używać za with openkażdym razem, możesz łatwo napisać funkcję, która zrobi to za Ciebie:

def append(txt='\nFunction Successfully Executed', file):
    with open(file, 'a') as f:
        f.write(txt)

Jeśli chcesz napisać w innym miejscu niż koniec, możesz użyć 'r+' :

import os

with open(file, 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

Wreszcie 'w+'parametr zapewnia jeszcze więcej swobody. W szczególności umożliwia utworzenie pliku, jeśli nie istnieje, a także opróżnienie zawartości pliku, który obecnie istnieje.


Kredyt za tę funkcję należy do @Primusa


2

Najprostszym sposobem dodania większej ilości tekstu na końcu pliku byłoby użycie:

with open('/path/to/file', 'a+') as file:
    file.write("Additions to file")
file.close()

Instrukcja a+in open(...)nakazuje otworzyć plik w trybie dołączania i umożliwia dostęp do odczytu i zapisu.

Dobrą praktyką jest również file.close()zamykanie wszelkich plików, które otworzyłeś po zakończeniu ich używania.


1
„file.close” jest automatycznie wywoływany na końcu bloku „with”, co jest zaletą słowa kluczowego. Ponadto OP poprosił o otwarcie pliku do dołączenia. Tryb „+” nie jest konieczny, chyba że chcesz również czytać.
Erik Knowles

-6

Oto mój skrypt, który w zasadzie liczy liczbę linii, następnie dodaje, a następnie zlicza je ponownie, abyś miał dowody, że zadziałało.

shortPath  = "../file_to_be_appended"
short = open(shortPath, 'r')

## this counts how many line are originally in the file:
long_path = "../file_to_be_appended_to" 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines initially" %(long_path,i)
long.close()

long = open(long_path, 'a') ## now open long file to append
l = True ## will be a line
c = 0 ## count the number of lines you write
while l: 
    try: 
        l = short.next() ## when you run out of lines, this breaks and the except statement is run
        c += 1
        long.write(l)

    except: 
        l = None
        long.close()
        print "Done!, wrote %s lines" %c 

## finally, count how many lines are left. 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines after appending new lines" %(long_path, i)
long.close()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.