Bestimmen Sie den Typ eines Wertes, der in python als String dargestellt wird

7

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?

    
IezyBoy 20.01.2010, 16:35
quelle

7 Antworten

14

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.

    
Nadia Alramli 20.01.2010 16:48
quelle
5

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:

  • Alle Werte sind gültige Zeichenketten, wir wissen, dass dies die Grundlage unseres Problems ist, daher ist es sinnlos, dies zu überprüfen. Wir sollten alles überprüfen, was wir können, was auch immer fällt, wir können es einfach als String verlassen.
  • Datumsangaben sind die naheliegendste Sache, die zuerst überprüft werden sollte, wenn sie in vorhersehbarer Weise formatiert sind, z. B. [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.
  • Als nächstes werden ganze Zahlen gemacht, weil alle Ganzzahlen gültige Gleitkommazahlen sind, aber nicht alle Gleitkommazahlen gültige Ganzzahlen sind. Wir könnten einfach prüfen, ob der Text Ziffern enthält (oder Ziffern und die Buchstaben A-F, wenn hexadezimale Zahlen möglich sind). Behandle den Wert in diesem Fall als Integer.
  • Floats wären die nächsten, da es sich um Zahlen mit einer gewissen Formatierung handelt (Dezimalpunkt). Es ist einfach, 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.
  • Alle nicht konvertierten Werte können als Strings behandelt werden.

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%     
Tendayi Mawushe 20.01.2010 17:24
quelle
2

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.

    
Noufal Ibrahim 20.01.2010 16:44
quelle
1

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.

jkp 20.01.2010 16:41
quelle
1

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.

    
truppo 20.01.2010 16:43
quelle
0

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.

    
AJ. 20.01.2010 16:40
quelle
0

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%     
telliott99 20.01.2010 16:41
quelle

Tags und Links