Ich habe eine (sehr groß) CSV-Datei, die etwa wie folgt aussieht:Python: effiziente Möglichkeit, nur ein paar Zeilen in einem csvreader Iterator zu überprüfen?
header1,header2,header3
name0,rank0,serial0
name1,rank1,serial1
name2,rank2,serial2
ich einige Code geschrieben haben, der die Datei verarbeitet, und schreibt sie aus (mit csvwriter) als solche modifiziert, mit einigen Informationen ich compute bis zum Ende jeder Zeile angefügt:
header1,header2,header3,new_hdr4,new_hdr5
name0,rank0,serial0,salary0,base0
name1,rank1,serial1,salary1,base1
name2,rank2,serial2,salary2,base2
Was ich versuche Struktur zu tun, ist das Skript, so dass es automatisch erkennt, ob die CSV-Datei, die es liest hat bereits verarbeitet . Wenn es verarbeitet wurde, kann ich später viele teure Berechnungen überspringen. Ich versuche zu verstehen, ob es einen vernünftigen Weg gibt, dies innerhalb der Leserschleife zu tun. I könnte nur die Datei einmal öffnen, genug einlesen, um die Erkennung zu tun, und dann schließen und öffnen Sie es mit einem Flag gesetzt, aber das scheint hackish.
Gibt es eine Möglichkeit, dies im selben Leser zu tun? Die Logik ist so etwas wie:
read first N lines ###(N is small)
if (some condition)
already_processed = TRUE
read_all_csv_without_processing
else
read_all_csv_WITH_processing
Ich kann nicht nur den Iterator verwenden, die Leser gibt mir, weil durch die Zeit, die ich genug Zeilen bekommen habe meinen bedingten Scheck zu tun, ich habe keine gute Möglichkeit, um zum Anfang der CSV zurückzukehren. Schließen und Wiedereröffnung es wirklich die eleganteste Art, dies zu tun?
Ihre eigene Lösung ist die beste: Öffnen Sie die Datei, lesen Sie ein paar Zeilen, schließen Sie die Datei und öffnen Sie die Datei erneut. Starten Sie dann eine Schleife mit einem gesetzten Flag, wenn sie verarbeitet wird oder nicht. Es ist überhaupt nicht hackisch, das zu tun. Das Öffnen und Schließen von Dateien ist ziemlich schnell, und als Vorteil werden die Dateidaten beim erneuten Lesen der Datei wahrscheinlich immer noch im Cache der Betriebssystemdatei gespeichert. – dawg
Warum behalten Sie nicht einfach auf, was Sie verarbeitet haben? –
@PadraicCunningham: das ist im Grunde, was ich tue - Ich möchte, dass der Code in der Lage ist zu sagen, ob es eine "verarbeitete" CSV oder eine "rohe" CSV durch das Vorhandensein der neuen Felder liest. * Wenn * ich eine Datei öffne, die bereits ausgeführt wurde, muss ich noch einige interne Datenstrukturen aktualisieren, aber es gibt einen großen Teil der Verarbeitung, die übersprungen werden kann. Ich habe anfangs versucht, die "vollständig verarbeitete" Datenstruktur zu picken, aber es dauerte genauso lange, die Pickle-Datei zu öffnen, als sie aus den Rohdaten neu zu erstellen. (Was ich für merkwürdig hielt, aber ich habe das mehrmals getestet ...) – ljwobker