Wenn ich eine kommagetrennte Datei oder eine Zeichenfolge mit dem CSV-Parser in Python lese, werden alle Elemente als String dargestellt. siehe Beispiel unten.
%Vor%
Ich möchte für jeden Wert bestimmen, ob es ein String, Float, Integer oder Datum ist. Wie kann ich das in Python machen?
Sie könnten so etwas tun:
%Vor%Der Schlüssel befindet sich in der Testreihenfolge, zum Beispiel sollte der int-Test vor dem Float-Test sein. Und für Termine können Sie weitere Tests für Formate hinzufügen, die Sie unterstützen möchten, aber natürlich können Sie nicht alle möglichen Fälle abdecken.
Dies kann nicht auf zuverlässige Art und Weise geschehen, und das liegt nicht an den Einschränkungen in Python oder einer anderen Programmiersprache. Ein Mensch kann dies nicht auf vorhersehbare Weise tun, ohne einige Regeln zu erraten und zu befolgen (üblicherweise Heuristik <) / a> wenn in diesem Zusammenhang verwendet).
Lassen Sie uns zunächst einige Heuristiken entwerfen und dann in Python kodieren. Dinge zu beachten sind:
[YYYY]-[MM]-[DD].
( ISO ISO 8601-Datumsformat) ) sie sind leicht von anderen Textteilen zu unterscheiden, die Zahlen enthalten. Wenn die Daten in einem Format mit nur Zahlen wie YYYYMMDD
vorliegen, dann sind wir fest, da diese Daten nicht von normalen Zahlen zu unterscheiden sind. 3.14159265
als Gleitkommazahl zu erkennen. % Co_de%, das einfach als 5.0
geschrieben werden kann, ist ebenfalls ein gültiger Gleitkommawert, wäre aber in den vorherigen Schritten gefangen worden und würde nicht als Gleitkommazahl erkannt, selbst wenn dies beabsichtigt wäre. Wegen der möglichen Überschneidungen, die ich oben erwähnt habe, kann ein solches Schema niemals 100% zuverlässig sein . Auch jeder neue Datentyp, den Sie unterstützen müssen (komplexe Zahl vielleicht), würde einen eigenen Satz von Heuristiken benötigen und müsste an der am besten geeigneten Stelle in der Prüfkette platziert werden. Je höher die Wahrscheinlichkeit, dass eine Überprüfung nur dem gewünschten Datentyp entspricht, desto höher sollte die Kette sein.
Lasst uns das jetzt in Python real machen, die meisten der oben erwähnten Heuristiken werden von Python für uns erledigt. Wir müssen nur über die Reihenfolge entscheiden, in der wir sie anwenden:
%Vor%Dies gibt Folgendes aus:
%Vor% Es gibt keine echte Antwort darauf, soweit ich das beurteilen kann, da dies nur Strings sind. Sie sind keine ganzen Zahlen oder schweben oder was auch immer. Das sind Rollen, die du entscheidest. z.B. Ist 1
eine Ganzzahl oder ein Gleitkommawert?
Aber ein paar Dinge kommen mir in den Sinn. Eine besteht darin, eine Art Mustererkennung durchzuführen (z. B. wenn es einen Dezimalpunkt enthält, ist es ein Gleitkomma usw.). Zum Analysieren / Raten von Daten können Sie versuchen dies oder dies .
Sie könnten auch versuchen, das Element in das zu "werfen", was Sie wollen, und Ausnahmen abfangen, um die anderen auszuprobieren. Sie können etwas wie try int machen, wenn es fehlschlägt, versuchen Sie float und wenn das fehlschlägt, versuchen Sie Datum etc.
Was Sie erreichen wollen, ist schwierig, weil die Typen mehrdeutig sind: "1" könnte zum Beispiel eine Zeichenkette oder eine Ganzzahl sein. Auf jeden Fall könntest du so etwas versuchen:
Termine: vermutlich sie in einem bekannten Format sind: wenn ja, können Sie versuchen, eine Datetime aus dem Zeitstempel-String Instanziieren ( datetime.strptime()
) und wenn es fehlschlägt, wissen Sie, dass es kein Datetime ist.
Floats: Stellen Sie sicher, dass alle Zeichen entweder eine Ziffer sind und mindestens ein "." in der Zeichenfolge. Dann konvertiere in float ( float(value)
)
Ganzzahlen: Regex die Zeichenfolge und die Übereinstimmung Ziffern. Stellen Sie sicher, dass die Zeichenfolge die gleiche Länge wie die Quellzeichenfolge hat, und konvertieren Sie dann ( int(value)
)
Wenn keiner der oben genannten funktioniert, ist es eine Zeichenfolge.
Nun ... du kannst nicht.
Wie würden Sie entscheiden, ob "5" als String oder Integer gemeint ist? Wie würden Sie entscheiden, ob "20100120" als Ganzzahl oder als Datum gemeint ist?
Sie können natürlich fundierte Vermutungen anstellen und eine Art von Parse-Order implementieren. Versuchen Sie es zunächst als Datum, dann als Float, dann als Int und schließlich als String.
Aus dem Handbuch :
Gebe ein Leserobjekt zurück, welches es tun wird Iterieren über Linien in der gegebenen csvfile. csvfile kann ein beliebiges Objekt sein welches das Iteratorprotokoll unterstützt und gibt jedes Mal einen String zurück next () -Methode heißt - Dateiobjekte und Listenobjekte sind beide geeignet.
Die Schnittstelle erfordert, dass bei jedem Aufruf von next () eine Zeichenfolge zurückgegeben wird.
Das Datum ist ein bisschen schwieriger. Es hängt vom Format und von der Regelmäßigkeit ab. Hier ist ein Hinweis, um mit dem Rest anzufangen.
%Vor%Aber beachten Sie:
%Vor%