Ich habe eine generierte Datei mit Tausenden von Zeilen wie folgt:
CODE,XXX,DATE,20101201,TIME,070400,CONDITION_CODES,LTXT,PRICE,999.0000,QUANTITY,100,TSN,1510000001
Einige Zeilen haben mehr Felder und andere weniger, aber alle folgen demselben Muster von Schlüssel / Wert-Paaren und jede Zeile hat ein TSN-Feld.
Wenn ich eine Analyse der Datei durchführte, schrieb ich eine Schleife wie die folgende, um die Datei in ein Wörterbuch zu lesen:
%Vor% ... das ist in Ordnung und macht genau das, was ich will (das print
ist nur ein triviales Beispiel).
Allerdings fühlt es sich für mich und die Zeile mit:
nicht besonders "pythonisch" an %Vor%Was fühlt sich einfach "klobig" an (wie oft iteriert es über die Felder?).
Gibt es einen besseren Weg, dies in Python 2.6 mit nur den Standardmodulen zu tun?
In Python 2 könnten Sie izip
im Modul itertools
und die Magie von Generator-Objekten verwenden, um Ihre eigene Funktion zu schreiben, um die Erstellung von Wertepaaren für die dict
Datensätze zu vereinfachen. Ich habe die Idee für pairwise()
von einem gleichnamigen (aber funktional unterschiedlichen) Rezept bekommen in Python 2 itertools
docs.
Um den Ansatz in Python 3 zu verwenden, können Sie einfach plain zip()
verwenden, da es das tut, was izip()
in Python 2 getan hat, was zu dessen Entfernung von itertools
führt - das Beispiel unten behandelt dies und sollte in beiden funktionieren Versionen.
Welches kann so in Ihrer Datei verwendet werden: for
loop:
Aber warten Sie, es gibt mehr!
Es ist möglich, eine verallgemeinerte Version zu erstellen. Ich rufe grouper()
auf, was wiederum einem ähnlich benannten, aber funktionell unterschiedlichen itertools
Rezept entspricht (welches direkt unter pairwise()
aufgeführt ist):
Was könnte so in Ihrer for
Schleife verwendet werden:
Natürlich ist es für spezielle Fälle wie diese einfach, functools.partial()
zu verwenden und eine ähnliche pairwise()
Funktion damit zu erstellen (was sowohl in Python 2 als auch in 3 funktioniert):
Postscript
Wenn nicht wirklich viele Felder vorhanden sind, können Sie stattdessen eine tatsächliche Sequenz aus den Paaren von Zeilenelementen erstellen (anstatt einen Generatorausdruck zu verwenden, der kein len()
hat):
Sie könnten mit einer einfacheren Funktion grouper()
auskommen:
Wenn wir es sowieso zu einer Funktion zusammenfassen, ist es nicht schwer "von Grund auf" zu schreiben:
%Vor%roberts Rezeptversion gewinnt jedoch definitiv Punkte für Flexibilität.
Tags und Links python parsing dictionary