2013-02-21 18 views
5

Ho visto questa domanda qui, ma le risposte fornite non hanno funzionato nel mio caso e sono state contrassegnate come duplicate.Come evitare il buffering nella libreria di file input Python

ho scavato nel codice sorgente (/usr/lib/python3.2/fileinput.py) e visto che readlines(bufsize) veniva usata internamente per caricare un buffer. Niente conchiglie o altri spasmi di piping.

+0

In realtà, penso che si possa desiderare 'python -u' in cima a qualsiasi altra cosa di cui si ha bisogno. Si desidera rimuovere qualsiasi buffering Python-e/o-stdio sottostante su 'stdin' e _also_ rimuovere qualsiasi buffer di lettura di riga superiore, giusto? – abarnert

risposta

5

Ciò che ha funzionato per me era semplicemente impostare FileInput(bufsize=1). La documentazione file.readlines() indica "L'argomento della dimensione opzionale, se specificato, è un limite approssimativo sul numero totale di byte nelle righe restituite." In pratica, ottengo esattamente una nuova riga ogni volta invece di dover riempire un buffer.

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

Sembra che questo sia effettivamente garantito, a patto che 'fileinput' usi' readlines (self._bufsize) '. Sfortunatamente, questo di per sé non è documentato come vero, ma se ti interessa solo di CPython 3.2 puoi essere sicuro che lo sia, e sembra piuttosto probabile che sia al sicuro molto al di là di questo, quindi se è abbastanza buono, ottimo. – abarnert

+0

E se si legge tramite 'IOBase.readlines' ([pure Python] (http://hg.python.org/cpython/file/3.2/Lib/_pyio.py#l497) e [C] (http: // hg.python.org/cpython/file/3.2/Modules/_io), chiamerà 'readline', che chiamerà' read' 1 byte alla volta se non ci sono buffer o 'peek'. Quindi, penso che lo accetti e dovresti accettare la tua risposta. – abarnert

+0

Inoltre, si potrebbe voler archiviare un bug di documentazione sul fatto che ['fileinput.input'] (http://docs.python.org/3/library/fileinput.html) non menziona cosa' bufsize' fa del tutto, e che il riferimento al linguaggio dovrebbe avere abbastanza informazioni per garantire che 'bufsize = 1' (insieme con' stdin' senza buffer, quando si legge da 'stdin') significhi unbuffered' fileinput'. – abarnert

Problemi correlati