2013-02-21 13 views
5

Widziałem to pytanie tutaj zadane, ale podane odpowiedzi nie działały w moim przypadku i zostały oznaczone jako duplikaty.Jak uniknąć buforowania w bibliotece wprowadzania plików Python

I wykopanych w kodzie źródłowym (/usr/lib/python3.2/fileinput.py) i stwierdził, że readlines(bufsize) był stosowany wewnętrznie załadowanie bufora. Bez powłoki i innych sznurków.

+0

Właściwie, myślę, że możesz chcieć 'python -u' na czymkolwiek, czego potrzebujesz. Chcesz usunąć bazowe buforowanie Pythona i/lub-stdio na 'stdin' oraz _also_ usunąć dowolny bufor odczytu linii wysokiego poziomu, prawda? – abarnert

Odpowiedz

5

To, co zadziałało, to po prostu ustawienie FileInput(bufsize=1). Dokumentacja file.readlines() stwierdza "Opcjonalny argument rozmiaru, jeśli jest podany, jest przybliżonym ograniczeniem całkowitej liczby bajtów zwróconych linii." W praktyce za każdym razem otrzymuję dokładnie jedną nową linię, zamiast wypełniać bufor.

with fileinput.input(bufsize=1) as f: 
    for line in f: 
     print("One line in, one line out!") 
+0

Wygląda na to, że tak naprawdę to działa, o ile 'fileinput' używa' readlines (self._bufsize) '. Niestety, samo to nie jest udokumentowane, ale jeśli zależy Ci tylko na CPython 3.2, możesz być pewien, że jest, i wydaje się całkiem prawdopodobne, że jest całkiem bezpieczny poza tym, więc jeśli jest wystarczająco dobry, to świetnie. – abarnert

+0

A jeśli przeczytasz "IOBase.readlines" ([czysty Python] (http://hg.python.org/cpython/file/3.2/Lib/_pyio.py#l497) i [C] (http: // hg.python.org/cpython/file/3.2/Modules/_io) implementacje, wywoła ona 'readline', która wywoła' odczyt' 1 bajtu na raz, jeśli nie ma bufora lub 'peek'. Sądzę więc, że to pasuje i powinieneś zaakceptować własną odpowiedź. – abarnert

+0

Możesz również zgłosić błąd związany z dokumentacją polegający na tym, że ['fileinput.input'] (http://docs.python.org/3/library/fileinput.html) nie wspomina o tym, co robi' bufsize' w ogóle i że referencje językowe powinny mieć wystarczającą ilość informacji, aby zagwarantować, że 'bufsize = 1' (wraz z niebuforowanym' stdin', podczas odczytu z 'stdin') oznacza niebuforowany' fileinput'. – abarnert

Powiązane problemy