Do operacji na plikach Python używa domyślnego buforowania systemu operacyjnego, chyba że skonfigurujesz go inaczej. Możesz określić rozmiar bufora, niebuforowany lub buforowany wiersz.
Na przykład funkcja open przyjmuje argument wielkości bufora.
http://docs.python.org/library/functions.html#open
„Opcjonalny argument buforowania określa pożądany rozmiar bufora pliku:”
- 0 oznacza niebuforowane,
- 1 oznacza buforowany wiersz,
- każda inna wartość dodatnia oznacza użycie bufora o (przybliżonej) tej wielkości.
- Buforowanie ujemne oznacza użycie domyślnego systemu, który jest zwykle buforowany liniowo dla urządzeń tty i w pełni buforowany dla innych plików.
- Jeśli zostanie pominięty, zostanie użyta wartość domyślna systemu.
kod:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
open('file.txt', 'w', 1)
, uzyskuję odpowiednie buforowanie linii. Ale jeśli zrobię coś większego (chciałemopen('file.txt', 'w', 512)
), buforuje pełnyio.DEFAULT_BUFFER_SIZE
8192. Czy to błąd Pythona, błąd Linuksa lub błąd ID10t?stdout
być buforowany w linii niezależnie od tego, czy jest to konsola, czy przekierowany do pliku?write()
uchwytu pliku, dane wyjściowe są buforowane w pamięci i gromadzone aż do zapełnienia bufora ... w tym czasie bufor zostaje „opróżniony” (zawartość jest zapisywana z bufora do pliku). Możesz jawnie opróżnić bufor, wywołującflush()
metodę na uchwycie pliku.flush()
Metodą można również wymusić opróżnienie bufora do pliku programowo .Uznałem, że jest to przydatne podczas dostosowywania pliku wyjściowego
tail -f
.źródło
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
flushing
ogóle oznacza. Dlaczego tego potrzebujemy? Po co to jest? dlaczego mam się tym przejmować?Nie wiem, czy dotyczy to również Pythona, ale myślę, że zależy to od używanego systemu operacyjnego.
Na przykład w systemie Linux dane wyjściowe do terminala opróżniają bufor w nowej linii, podczas gdy dane wyjściowe do plików są opróżniane tylko wtedy, gdy bufor jest pełny (domyślnie). Wynika to z faktu, że bardziej wydajne jest opróżnianie bufora mniej razy, a użytkownik jest mniej prawdopodobne, aby zauważyć, że dane wyjściowe nie są opróżniane w nowej linii w pliku.
Możesz być w stanie automatycznie opróżnić wyjście, jeśli tego potrzebujesz.
EDYCJA: Myślę, że w ten sposób spłukałbyś się automatycznie w Pythonie (na podstawie stąd )
źródło
Możesz również sprawdzić domyślny rozmiar bufora, wywołując atrybut tylko do odczytu DEFAULT_BUFFER_SIZE z modułu io.
źródło
Oto inne podejście, aż do PO, aby wybrać, które preferuje.
Gdy dołączasz poniższy kod do
__init__
pliku .py przed jakimkolwiek innym kodem, wiadomości drukowane wraz zprint
wszelkimi błędami nie będą już rejestrowane w pliku Log.txt Abletona, ale w celu oddzielenia plików na dysku:(w przypadku komputerów Mac zmień
#username#
nazwę folderu użytkownika. W systemie Windows ścieżka do folderu użytkownika będzie miała inny format)Po otwarciu plików w edytorze tekstu, który odświeża zawartość po zmianie pliku na dysku (przykład dla komputerów Mac: TextEdit nie robi tego, ale TextWrangler robi to), zobaczysz, że dzienniki są aktualizowane w czasie rzeczywistym.
Kredyty: ten kod został skopiowany głównie ze skryptów kontrolnych liveAPI Nathana Ramelli
źródło