Ich habe das folgende Codeschnipsel:
%Vor% Dabei sind first_lines
die ersten 2048 Byte der Datei. Die Funktion arbeitet die meiste Zeit gut und gibt True
für eine Datei zurück, die wie folgt beginnt:
Die Funktion gibt jedoch False
für die folgende Datei mit der gleichen Gesamtstruktur zurück:
Ist das ein Fehler in has_header
oder ein Edge-Case, bei dem die Heuristik von has_header
fehlschlägt?
Einige Unterschiede, die ich festgestellt habe:
die Variable header
in Zeile 394 in csv.py ist ['SPEC#: 1, SIZE: 18473, TIME: 0.000000']
(Liste der Länge 1) für die erste Datei, in der der Header korrekt ermittelt wurde, und ['SPEC#: 1, SIZE: 184', '4, TIME: 0.000000']
(Liste der Länge 2) für die zweite Datei.
Nach dem Erstellen eines Wörterverzeichnisses mit Datentypen für jede Spalte ist die Variable columnTypes
{0: None}
für die erste Datei und {}
für die zweite Datei.
wenn ich das versuche (mit data1
ist dein erstes und data2
dein zweites Beispiel:
Ich bekomme:
%Vor% Das bedeutet, dass das Problem tatsächlich die Erkennung des Begrenzers ist. Wie Sie im Docstring von _guess_delimiter sehen können, verwendet der Sniffer eine Häufigkeitsanalyse, um den Der beste Kandidat für das Trennzeichen, in diesem Fall '7'
anstelle von Leerzeichen.
Wenn Sie Ihr zweites Beispiel als csv mit einem Trennzeichen von '7'
behandeln, erhalten Sie Folgendes:
wobei die erste Zeile eine vollkommen akzeptable Datenzeile anstelle einer Kopfzeile wäre.
Leider können Sie in has_header
den verwendeten Dialekt nicht manuell angeben, aber Sie könnten die sniff
-Methode des Sniffers patchen, um einen Dialekt mit dem richtigen Trennzeichen ' '
zurückzugeben.