csv mit Separator-Zeichen im Einzeleintrag

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Thomas67
User
Beiträge: 5
Registriert: Montag 2. März 2026, 21:29

Salve

ich bin neu hier und noch nicht sicher, wo ich dieses Thema posten soll

Ich lese in Python ein csv-File ein, welches Kommata als Spaltenseparatoren verwendet.
Das File lese ich zuerst mit .readlines und liefert einzelne Zeilen.
Diese Zeilen teile ich mit split auf
In der ersten Zeile bestimme ich die Spaltenköpfe und die gesuchten Spaltennummern.

Allerdings habe ich in manchen Zeilen Einträge, die in der Spalte auch ein Komma im Eintrag enthalten
Im Debugger werden diese Einträge mit Anführungszeichen angezeigt.
Die Split-Funktion ignoriert mir diese und teilt dies auf.

Beispiel
Zeile: 'Eintrag1,Eintrag2,"Eintrag3, 4",Eintrag5'
Beabsichtigte, gewünschte Aufteilung wäre ( die // zur Verdeutlichung )
Eintrag1 // Eintrag2 // Eintrag3, 4 // Eintrag5
Der Split liefert aber
'Eintrag1 // Eintrag2 // Eintrag3 // 4 // Eintrag5

Wie schaffe ich das, dass der dritte Spalteneintrag als "Eintrag3, 4" nach dem Split erhalten bleibt?

Danke
Thomas
geraldfo
User
Beiträge: 82
Registriert: Samstag 28. Januar 2023, 20:19
Wohnort: Nähe Wien
Kontaktdaten:

Benutzeravatar
noisefloor
User
Beiträge: 4307
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

die Lösung ist: nicht selber machen, sondern das passende Modul verwenden, siehe vorheriger Beitrag. Da kannst du dem CSV Reader auch mitgeben, was der `separator` ist - nämlich bei dir das Komma - und was der `quotechar` ist - nämlich bei dir die Anführungszeichen.

Gruß, noisefloor
Thomas67
User
Beiträge: 5
Registriert: Montag 2. März 2026, 21:29

Danke
werde ich testen; hatte ich bisher nur am Rande gesehen, aber beim ersten Lesen immer ein paar Sachen gesehen, die mir da quer schossen, bswp. dass wohl alles per String kommt und manchmal mit umschlossenen Anführungszeichen.
Hat jemand einen Tip für aussagekräftigen Beispielcode?
Danke
thomas
Benutzeravatar
__blackjack__
User
Beiträge: 14342
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Thomas67: Wenn Du die einzelnen Zeilen (= Zeichenketten) selber zerlegst, bekommst Du ja auch Zeichenketten. Und Anführungszeichen in einzelnen Zellen bekommt man nur wenn da auch tatsächlich Anführungszeichen drin sind. Bei Deinem Beispiel sind keine _in_ den Zellen:

Code: Alles auswählen

>>> next(csv.reader(io.StringIO('Eintrag1,Eintrag2,"Eintrag3, 4",Eintrag5', newline="")))
['Eintrag1', 'Eintrag2', 'Eintrag3, 4', 'Eintrag5']
Tipp für Beispielcode wäre die Dokumentation vom `csv`-Modul.
“It is easier to optimize correct code than to correct optimized code.” — Bill Harlan
Thomas67
User
Beiträge: 5
Registriert: Montag 2. März 2026, 21:29

Danke!
Thomas67
User
Beiträge: 5
Registriert: Montag 2. März 2026, 21:29

Danke! Funktioniert..... aber wie erwartet bekomme ich nun alles als Text und muss numerische Werte halt entsprechend umwandeln. Aber ist bei csv an sich auch nicht anders zu erwarten...
Benutzeravatar
snafu
User
Beiträge: 6958
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Thomas67:
Richtig, die einzelnen Felder muss man in die passenden Typen konvertieren. Je nach Programmierstil könnte man diese auch per zip() mit der Ausgabe des Readers kombinieren. Etwas mehr Komfort gibt einem die read_csv()-Funktion der pandas-Bibliothek mit dem dtype-Parameter. Dafür muss man natürlich pandas inkl. numpy installiert haben.

Falls dir Dezimalzahlen in deutscher Schreibweise vorliegen, kannst du das Komma und ggf. den Punkt als Tausendertrenner mittels replace() umwandeln oder atof() aus dem locale-Modul der Standardbibliothek verwenden. Für letzteres müssen aber vorab die Spracheinstellungen (setlocale) auf German eingestellt werden, sonst funktioniert die Umwandlung nicht.

EDIT: Pandas bietet einem auch convert_dtypes für eine automatische Umwandlung der Daten. Das funktioniert allerdings nicht mit den besagten deutschsprachigen Kommazahlen. Deine Angabe aus dem ersten Beitrag lässt entsprechende Vermutungen bei mir aufkommen...
Benutzeravatar
snafu
User
Beiträge: 6958
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nachtrag: read_csv() bietet einem die Parameter thousands und decimal. Die kann man für deutsche Zahlen anpassen. Dann funktioniert auch convert_dtypes() auf Anhieb. Pandas (falls dir noch nicht bekannt) ist ne umfangreiche Bibliothek und wegen der der Numpy-Abhängigkeit auf manchen Systemen nicht ohne Weiteres verfügbar. Aber sie kann eben auch vieles.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1332
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

snafu hat geschrieben: Mittwoch 4. März 2026, 02:59 Nachtrag: read_csv() bietet einem die Parameter thousands und decimal.
Wo steht das in der Doku? Hab gerade danach gesucht und nichts gefunden.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 14342
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DeaD_EyE: Das steht in der Dokumentation von der Funktion. Und zwar bis zurück zur Version 1.0, dass heisst die beiden Argumente gab es schon von Anfang an: pandas.read_csv()
“It is easier to optimize correct code than to correct optimized code.” — Bill Harlan
Benutzeravatar
DeaD_EyE
User
Beiträge: 1332
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

__blackjack__ hat geschrieben: Mittwoch 4. März 2026, 15:51 @DeaD_EyE: Das steht in der Dokumentation von der Funktion. Und zwar bis zurück zur Version 1.0, dass heisst die beiden Argumente gab es schon von Anfang an: pandas.read_csv()
Da kann ich in der Python-Doku lange suchen :D
Pandas ist für mich ein rotes Tuch.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Thomas67
User
Beiträge: 5
Registriert: Montag 2. März 2026, 21:29

Danke Euch
hab mit python grad erst vor 2-3 Wochen angefangen und bin noch in der Orientierung. s Meiste von Panda&co schopn gelesen oder gehört, aber nichts davon bisher bewertbar meinerseits
Antworten