ho ottenuto il seguente frammento di codiceProcessing solo linee non vuote
def send(self, queue, fd):
for line in fd:
data = line.strip()
if data:
queue.write(json.loads(data))
Che naturalmente funziona bene, ma a volte mi chiedo se c'è un modo "migliore" per scrivere che costrutto in cui si agisci solo su righe non vuote.
La sfida è questa: si dovrebbe usare la natura iterativa di per la lettura di "fd" ed essere in grado di gestire i file nell'intervallo di oltre 100 MB.
UPDATE - Nella tua fretta di ottenere punti per questa domanda, stai ignorando una parte di importazione, che è l'utilizzo della memoria. Per esempio l'espressione:
non_blank_lines = (line.strip() for line in fd if line.strip())
sta per tamponare l'intero file nella memoria, per non parlare svolgere un'azione striscia() due volte. Che funzionerà con file di piccole dimensioni, ma fallisce quando hai 100 + MB di dati (o una volta ogni 100 GB).
Parte della sfida è le seguenti opere, ma è la zuppa di leggere:
for line in ifilter(lambda l: l, imap(lambda l: l.strip(), fd)):
queue.write(json.loads(line))
sguardo per la gente di magia!
AGGIORNAMENTO FINALE: PEP-289 è molto utile per la mia migliore comprensione della differenza tra [] e() con gli iteratori coinvolti.
Questa non è esattamente una risposta alla tua domanda, ma per i file di grandi dimensioni, potresti voler dare un'occhiata a IO bufferizzato (http://neopythonic.blogspot.com/2008/10/sorting-million-32-bit -integers-in-2mb.html) – BorrajaX
Non riesco davvero a pensare a un modo migliore. Solo l'altra cosa che potresti fare è scrivere la tua funzione '__iter__' per il tuo oggetto' fd' (di cui non ci hai dato molte informazioni) in modo che esso restituisca solo linee che non sono vuote. – jdotjdot
fd è molto semplice: '' con open (FILENAME) come fd: '' – koblas