Mam następujący fragment kodutworzenie nie tylko puste linie
def send(self, queue, fd):
for line in fd:
data = line.strip()
if data:
queue.write(json.loads(data))
Co oczywiście działa dobrze, ale zastanawiam się czasem, czy jest „lepszy” sposób napisać, że konstrukt, gdzie działają tylko na niepustych liniach.
Wyzwanie polega na tym, że należy używać iteracyjnego charakteru pliku "fd" do odczytu i obsługiwać pliki z zakresu ponad 100 MB.
AKTUALIZACJA - W swoim pośpiechu, aby zdobyć punkty za to pytanie, ignorujesz część importującą, czyli użycie pamięci. Na przykład wyrażenie:
non_blank_lines = (line.strip() for line in fd if line.strip())
będzie bufor cały plik do pamięci, nie wspominając wykonywania pasek() działania dwukrotnie. Który będzie działać dla małych plików, ale nie powiedzie się, gdy masz 100 + MB danych (lub raz na jakiś czas 100 GB).
Część wyzwaniem jest następujące prace, ale jest zupa czytać:
for line in ifilter(lambda l: l, imap(lambda l: l.strip(), fd)):
queue.write(json.loads(line))
Look dla magicznych ludzi!
AKTUALNA AKTUALIZACJA: PEP-289 jest bardzo przydatna dla mojego lepszego zrozumienia różnicy między [] i() z włączonymi iteratorami.
To nie jest odpowiedź na twoje pytanie, ale w przypadku dużych plików możesz chcieć spojrzeć na buforowaną IO (http://neopythonic.blogspot.com/2008/10/sorting-million-32-bit -integers-in-2mb.html) – BorrajaX
Nie mogę wymyślić lepszego sposobu. Inną rzeczą, którą możesz zrobić, jest napisanie swojej własnej funkcji '__iter__' dla twojego obiektu' fd' (o którym nie dałeś nam zbyt wielu informacji), aby tylko "dostarczyło ci linii, które nie są puste. – jdotjdot
fd jest bardzo proste: '' with open (FILENAME) as fd: '' – koblas