Czy tryb zapisu pliku „dołączanie” w Pythonie zapisuje tylko nowe bajty, czy też ponownie zapisuje cały plik?
Chociaż wyobrażam sobie, że tryb dopisywania jest na tyle „inteligentny”, że wstawia tylko nowe dołączane bajty, chcę mieć absolutną pewność, że Python tego nie obsłuży, przepisując cały plik wraz z nowymi bajtami.
Próbuję zachować działającą kopię zapasową dziennika programu, która może osiągnąć kilka tysięcy rekordów w formacie CSV.
Odpowiedzi
Operacje na plikach w Pythonie są wygodnymi opakowaniami w stosunku do operacji na plikach systemu operacyjnego. System operacyjny albo implementuje operacje tego systemu plików wewnętrznie, przekazuje je do ładowalnego modułu (wtyczki) lub na serwer zewnętrzny (NFS, SMB). Większość systemów operacyjnych od 1971 roku jest w stanie wykonywać dołączanie danych do istniejącego pliku. Przynajmniej wszystkie te, które twierdzą, że są choćby zdalnie zgodne z POSIX.
Tryb dołączania POSIX po prostu otwiera plik do zapisu i przesuwa wskaźnik pliku na koniec pliku. Oznacza to, że wszystkie operacje zapisu będą po prostu zapisywać poza koniec pliku.
Może być kilka wyjątków od tej reguły, na przykład niektóre procedury mogą używać wywołań systemowych niskiego poziomu w celu przesunięcia wskaźnika pliku do tyłu. Lub bazowy system plików może nie być zgodny z POSIX i używać jakiejś formy obiektowej pamięci transakcyjnej, takiej jak AWS S3. Ale w każdym standardowym scenariuszu nie martwiłbym się takimi przypadkami.
Jednak ponieważ wspomniałeś o kopii zapasowej jako przypadku użycia, musisz być bardzo ostrożny. Kopie zapasowe nie są tak łatwe, jak się wydaje na pierwszy rzut oka. Rzeczy, o które należy się martwić, różne pamięci podręczne, które mogą przechowywać dane w pamięci wcześniej, jeśli zostaną zapisane na dysku. Co się stanie, jeśli zasilanie zgaśnie zaraz po dodaniu nowych rekordów. Co się stanie, jeśli ktoś uruchomi kilka kopii Twojego programu?
I ostatnia rzecz. Jeśli nie korzystasz z 8-bitowego komputera z lat 80-tych, kilka tysięcy linii CSV to nic dla współczesnego sprzętu. Nawet jeśli pliki zostaną załadowane i z powrotem zapisane, nie zauważysz żadnej różnicy