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!).
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'
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 )
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.
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
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.
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)
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.
„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):passprint"%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 writewhile 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):passprint"%s has %i lines after appending new lines"%(long_path, i)
long.close()
with open(file, "a")
metody. Jestem może staroświecki, ale jaka jest przewaga nadopen(file, "a") ... file.close()
print("appended text", file=myfile)
jest również możliwe dla bardziej znanego API.open()
nie koduje na stałeutf-8
. Używalocale.getpreferredencoding(False)
. Przekażencoding="utf-8"
parametr jawnie, jeśli wiesz, że plik używa kodowania utf-8.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:
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:
W rzeczywistości,
fopen
podręcznika stwierdza:Stara uproszczona odpowiedź (nieużywana
with
):Przykład: ( w prawdziwym programie użyj
with
do zamknięcia pliku - patrz dokumentacja )źródło
close()
?with
- patrz docs.python.org/2/whatsnew/2.6.html#pep-343-the-with-statementZawsze to robię
To proste, ale bardzo przydatne.
źródło
f
zmienną do innych funkcji, ta sama funkcja, która otwiera plik, powinna go zamknąć.with
Składnia jest preferowanym sposobem do osiągnięcia tego celu.Prawdopodobnie chcesz przekazać
"a"
jako argument trybu. Zobacz dokumentację open () .Istnieją inne kombinacje argumentu mode dla trybu aktualizacji (+), obcinania (w) i binarnego (b), ale rozpoczęcie od właśnie
"a"
jest najlepszym wyborem.źródło
file
rzuca cień na wbudowaną funkcję. Nie używaj go do zmiennych.file
nie jest już wbudowany w Python 3. Nawet w Python 2 jest używany bardzo rzadko . Otwieranie pliku jest częstą operacją. Możnafile
tutaj używać nazwy zarówno w Pythonie 2, jak i 3. Wiedzieć, kiedy być niespójnym.Python ma wiele odmian poza głównymi trzema trybami, te trzy tryby to:
Tak więc dodanie do pliku jest tak proste, jak:
Są też tryby, które po prostu zmniejszają liczbę wierszy kodu:
Wreszcie istnieją tryby odczytu / zapisu w formacie binarnym:
źródło
gdy korzystamy z tego wiersza
open(filename, "a")
, którya
oznacza 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
źródło
Można również zrobić to
print
zamiastwrite
:Jeśli test.txt nie istnieje, zostanie utworzony ...
źródło
WRITE_TO_FILE = open('my_file.txt', mode='a')
, a następnie podczas swojego programu możesz mieć kilka wydruków takichprint('Hello world', file=WRITE_TO_FILE)
, a kiedy tylko zdecydujesz się zobaczyć wyjście na konsoli, po prostu zmień flagę naWRITE_TO_FILE = None
. Nie zapomnij zamknąć pliku na końcu, jeśli nie jestNone
Możesz także otworzyć plik w
r+
trybie, a następnie ustawić pozycję pliku na końcu pliku.Otwarcie pliku w
r+
trybie pozwoli Ci napisać do innych pozycjach plików oprócz końcu, podczasa
ia+
siła pisania do końca.źródło
jeśli chcesz dołączyć do pliku
Zadeklarowaliśmy zmienną,
myfile
aby otworzyć plik o nazwietest.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 plikuoto opcje trybu pliku
źródło
W
'a'
oznacza parametr trybie dopisywania. Jeśli nie chcesz używać zawith open
każdym razem, możesz łatwo napisać funkcję, która zrobi to za Ciebie:Jeśli chcesz napisać w innym miejscu niż koniec, możesz użyć
'r+'
† :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
źródło
Najprostszym sposobem dodania większej ilości tekstu na końcu pliku byłoby użycie:
Instrukcja
a+
inopen(...)
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.źródło
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.
źródło