2014-12-11 2 views
10

Ich benutze Python (2.6) CSV DictReader. Meine Eingabedatei eine Kopfzeile hat, wo die Spaltennamen Leerzeichen am Ende haben:Python wie triming Leerzeichen in CSV DictReader Schlüssel

colname1,  colname2  ,col3, etc. 
XX, YY, ZZ 

Das zurück dict Objekt Taste() = ['colname1', 'colname2 ', 'col3']

Gibt es eine Option, die trimmen und Leerzeichen am Ende von den Tasten?

--edit

Das Problem wird durch Schlüsselnamen in der Verarbeitung entsteht:

with open(fname) as f: 
    r = csv.DictReader(f) 
    for row in r: 
     print "processing", r["column1"], r["column2"] 

Die Dateien sind Datenbank-Dumps. Und das Dump-Programm ist viel zu schlau - es passt die Breite der Ausgabespalte abhängig von den Daten an - was bedeutet, dass verschiedene Selektorensätze unterschiedliche Spaltenbreite und unterschiedliche Schlüssellängen haben. Manchmal muss ich r['column2 '] verwenden und manchmal Felder auffüllen oder reduzieren. Autsch!

Antwort

9

Lesen Sie einfach die erste Zeile manuell und übergeben Sie sie an die DictReader.

with open('file.csv') as fh: 
    header = [h.strip() for h in fh.next().split(',')] 
    reader = csv.DictReader(fh, fieldnames=header) 
+1

Ich wünsche Dies war eine Option in csv.DictReader. (Gibt es einen Ort, um solche Wunschlisten auszudrücken?) – Dinesh

+0

Sie könnten versuchen, die Funktion anzufragen, aber die Chancen stehen gut, dass sie nicht hinzugefügt werden. Um fair zu sein, Ihre CSV ist kaputt;) – Wolph

+1

ja, dass CSV ist * ungewöhnlich * aber es ist ein Datenbank-Dump und jeder Anbieter hat seine Persönlichkeit. Aber ich weiß das Ergebnis nicht zu fragen :) Wo fragt man? – Dinesh

1

Sie benötigen einen benutzerdefinierten Dialekt im csv-Modul

csv.register_dialect('MyDialect', quotechar='"', skipinitialspace=True, quoting=csv.QUOTE_NONE, lineterminator='\n', strict=True) 

dann den Dialekt verwenden, um zu registrieren, wenn die DictReader erstellen:

my_reader = csv.DictReader(trip_file, dialect='MyDialect') 

Hier ist alles Dialect Options