has_header von csv.Sniffer gibt unterschiedliche Ergebnisse für Dateien mit demselben Layout

8

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:

%Vor%

Die Funktion gibt jedoch False für die folgende Datei mit der gleichen Gesamtstruktur zurück:

%Vor%

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.

BioGeek 26.06.2012, 10:14
quelle

1 Antwort

13

wenn ich das versuche (mit data1 ist dein erstes und data2 dein zweites Beispiel:

%Vor%

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:

%Vor%

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.

    
mata 28.06.2012, 11:43
quelle

Tags und Links