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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Dennis S. (eltio)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.