Forum: PC-Programmierung Python: Spalten von csv.DictReader entfernen


von Dennis S. (eltio)


Lesenswert?

Hallo zusammen,
ich lese eine Reihe von CSV-Dateien ein und konvertiere sie in Python.
1
reader = csv.DictReader(file, delimiter=";")
2
next(reader)
3
out = json.dumps([row for row in reader])

Das Problem ist: einige CSV-Dateien haben am Ende ein abschließendes 
Semikolon. Die Ausgabe einer Reihe von reader lautet dann z.B.:
1
{'': '', 'A': '111', 'B': '222', 'C': '333'}

Gibt es eine elegante Möglichkeit die Spalte '': '' rauszufiltern? Auf 
die Eingangsdaten habe ich so erstmal keinen Einfluss.

Gruß
Dennis

von SR (Gast)


Lesenswert?

http://stackoverflow.com/questions/31822350/skip-blank-columns-in-csv-dictreader

Ich würde aber bevorzugen die Datei neu zu speichern und vorher auf 
jeder Zeile ein rstrip(';') zu machen...

von Dennis S. (eltio)


Lesenswert?

Vom kompletten Neuschreiben schrecke ich im Moment etwas zurück, weil 
die Dateien insgesamt mehrere hundert MB groß werden können.. Ich hatte 
gehofft es gibt was trickiges in der Zeile mit dem json.dumps.

: Bearbeitet durch User
von SR (Gast)


Lesenswert?

Das ist ja im geposteten Link skizziert - da wird dir nichts anderes 
übrig blieben als auch noch in jeder Zeile die letzte Zelle zu prüfen.

von SR (Gast)


Lesenswert?

Wenn es dir um die Performance bei großen Dateien geht - du hast doch 
sicher sed zur Hand?

Dann einfach (auch mit Python vorher / os.popen oder auch anders):

sed 's/;$//' datei.csv > datei_ohne_trailing_semikolon.csv

von Tom K. (ez81)


Lesenswert?

Der Parameter file in csv.DictReader
"can be any object which supports the iterator protocol and returns a 
string each time its __next__() method is called — file objects and list 
objects are both suitable"

Deshalb kann man eine Generator-Funktion zwischen Datei und Konstruktor 
schummeln, die die Zeilen vorbearbeitet:
1
def fix_lines(infile):
2
    for line in infile:
3
        yield line.rstrip().rstrip(';')
4
5
content = open('1.csv')
6
reader = csv.DictReader(fix_lines(content), delimiter=";")
7
next(reader)
8
out = json.dumps([row for row in reader])
9
print(out)

von Dennis S. (eltio)


Lesenswert?

Danke für eure Anregungen.

@Tom K: Die Möglichkeit mit Generatoren zu arbeiten kenne ich, ist mir 
aber noch nicht so richtig in Fleisch und Blut übergegangen.

Im Endeffekt probiere ich es erstmal mit dem "Preprocessing" und dem 
Neuschschreiben einer Datei. Es wird sich zeigen ob das wirklich ein 
Problem darstellt.

Gruß
Dennis

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.