Jak często python jest spłukiwany do pliku?

  1. jak często Python jest spłukiwany do pliku?
  2. jak często Python spłukuje do stdout?

Nie jestem pewien (1).

Jeśli chodzi o (2), uważam, że Python spłukuje się do stdout po każdej nowej linii. Ale jeśli przeciążasz stdout, aby być do pliku, czy to tak często?

Author: Michael Currie, 2010-07-02

5 answers

Do operacji na plikach Python używa domyślnego buforowania systemu operacyjnego, chyba że skonfigurujesz go inaczej. Można określić rozmiar bufora, niebuforowany lub buforowany wiersz.

Na przykład funkcja open pobiera argument wielkości bufora.

Http://docs.python.org/library/functions.html#open

"opcjonalny argument buforowania określa żądany rozmiar bufora pliku:"

  • 0 oznacza niebuforowany,
  • 1 oznacza linię buforowaną,
  • każda inna wartość dodatnia oznacza użycie bufora o (w przybliżeniu) tej wielkości.
  • buforowanie ujemne oznacza użycie domyślnej wartości systemowej, która jest zwykle buforowana dla urządzeń tty i w pełni buforowana dla innych plików.
  • jeśli pominięto, używana jest domyślna wartość systemowa.

Kod:

bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
 252
Author: Corey Goldberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-06 22:12:52

Można również wymusić przepłukanie bufora do pliku programowo za pomocą flush() metoda.

with open('out.log', 'w+') as f:
    f.write('output is ')
    # some work
    s = 'OK.'
    f.write(s)
    f.write('\n')
    f.flush()
    # some other work
    f.write('done\n')
    f.flush()

Uznałem to za przydatne podczas śledzenia pliku wyjściowego za pomocą tail -f.

 128
Author: kortina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-19 13:56:04

Nie wiem, czy dotyczy to również Pythona, ale myślę, że zależy to od używanego systemu operacyjnego.

Na przykład w Linuksie wyjście do terminala spłukuje bufor w nowej linii, podczas gdy wyjście do plików spłukuje tylko wtedy, gdy bufor jest pełny (domyślnie). Dzieje się tak dlatego, że bardziej wydajne jest spłukiwanie bufora mniej razy, a użytkownik jest mniej prawdopodobne, aby zauważyć, jeśli Wyjście nie jest spłukane na nowej linii w pliku.

Możesz być w stanie automatycznie spłukać wyjście, jeśli tego potrzebujesz.

EDIT: myślę, że w Pythonie można by w ten sposób automatycznie spłukać (na podstawie from here )

#0 means there is no buffer, so all output
#will be auto-flushed
fsock = open('out.log', 'w', 0)
sys.stdout = fsock
#do whatever
fsock.close()
 11
Author: KLee1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-03 17:47:40

Można również sprawdzić domyślny rozmiar bufora, wywołując atrybut DEFAULT_BUFFER_SIZE tylko do odczytu z modułu io.

import io
print (io.DEFAULT_BUFFER_SIZE)
 9
Author: N Randhawa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-20 15:28:11

Oto inne podejście, do OP, aby wybrać, który z nich preferuje.

Po umieszczeniu poniższego kodu w pliku __init__. py przed jakimkolwiek innym kodem, wiadomości wydrukowane z print i wszelkie błędy nie będą już rejestrowane w Dzienniku Abletona.txt ale aby oddzielić pliki na dysku:

import sys

path = "/Users/#username#"

errorLog = open(path + "/stderr.txt", "w", 1)
errorLog.write("---Starting Error Log---\n")
sys.stderr = errorLog
stdoutLog = open(path + "/stdout.txt", "w", 1)
stdoutLog.write("---Starting Standard Out Log---\n")
sys.stdout = stdoutLog

(w przypadku komputerów Mac Zmień #username# na nazwę folderu użytkownika. W systemie Windows ścieżka do folderu użytkownika będzie miała inny format)

Podczas otwierania plików w edytorze tekstu, który odświeża jego zawartość po zmianie Pliku na dysku (przykład dla Mac: TextEdit nie, ale TextWrangler tak), zobaczysz logi aktualizowane w czasie rzeczywistym.

kredyty: ten kod został skopiowany głównie ze skryptów liveAPI control surface autorstwa Nathana Ramelli

 0
Author: Mattijs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-29 09:09:07