ubuntuusers.de

Python - Zeile mit csv.writer in CSV-Datei schreiben

Status: Gelöst | Ubuntu-Version: Server 14.04 (Trusty Tahr)
Antworten |

Tronde Team-Icon

Avatar von Tronde

Anmeldungsdatum:
23. November 2006

Beiträge: 1640

Hallo zusammen,

ich möchte mit der Methode csvwriter.writerow() eine Zeile in eine CSV-Datei schreiben. Dabei scheine ich die Methode falsch zu benutzen, da ich nicht das erwartete Ergebnis erhalte. Ich test mit folgendem Beispielcode:

1
2
3
4
with open('csvfile.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    row = str("Hallo Welt")
    writer.writerow(row)

Die Ausgabe der Datei sieht nun wie folgt aus:

1
H,a,l,l,o, ,W,e,l,t

Bei meinen Versuchen werden stets die einzelnen Zeichen durch Kommata getrennt. Wie kann ich denn einen String in die Datei schreiben? So dass das Ergebnis eher so aussieht:

1
Hallo Welt,

Kann mir jemand erklären, wie man das macht?

Viele Grüße
Tronde

zim

Avatar von zim

Anmeldungsdatum:
27. Juni 2005

Beiträge: 662

Wohnort: bremen

Hey,

ich habe keine Ahnung von Python, aber ein kurze Google Suche hat ergeben das die Funktion writerow ein iterierbares Objekt als Parameter erwartet. Wenn du der Funktion also einen String gibst iteriert es über den String. Das heisst in diesem Fall über die einzelnen Buchstaben. Du kannst deinen String mit eckigem Klammern umgeben damit es als Array erkannt wird. Dann wird über die einzelnen Elemente des Arrays iteriert, aber die Inhalte bleiben ganz.

Quelle: http://stackoverflow.com/questions/1816880/why-does-csvwriter-writerow-put-a-comma-after-each-character

Grüße
zim

sebix Team-Icon

Moderator, Webteam

Anmeldungsdatum:
14. April 2009

Beiträge: 5582

Wie zim schon anmerkte, writer.writerow() erwartet ein iterierbares Objekt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
>>> import csv, io
>>> f = io.StringIO()
>>> writer = csv.writer(f)
>>> row = str("Hallo Welt")
>>> writer.writerow(row)
21
>>> f.getvalue()
'H,a,l,l,o, ,W,e,l,t\r\n'
>>> writer.writerow([row])
12
>>> f.getvalue()
'H,a,l,l,o, ,W,e,l,t\r\nHallo Welt\r\n'

str("Hallo Welt") ist btw gleichbedeutend mit "Hallo Welt"

Tronde Team-Icon

(Themenstarter)
Avatar von Tronde

Anmeldungsdatum:
23. November 2006

Beiträge: 1640

Guten Morgen,

habt vielen Dank für eure Hilfe. Nun habe ich es verstanden. 💡

MfG
Tronde

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

CSV arbeitet spaltenorientiert. Und auch der Name writerow sagt ja schon aus, dass eine Spalte erwartet wird. Da Python dynamisch typisiert ist, gibt sich die Methode mit jedem iterierbaren Objekt zufrieden. Daher kracht es nicht, wenn fälschlicherweise ein String übergeben wird. Denn über einen String zu iterieren heißt, die einzelnen Zeichen des Strings abzuarbeiten. Das macht in diesem Fall natürlich wenig Sinn. Gefordert ist hier vielmehr eine Liste (oder ein Tupel), welche die einzelnen Werte für eine Spalte enthält.

zim

Avatar von zim

Anmeldungsdatum:
27. Juni 2005

Beiträge: 662

Wohnort: bremen

row heißt übersetzt Zeile nicht Spalte 😀

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

zim schrieb:

row heißt übersetzt Zeile nicht Spalte 😀

Richtig. In dem Moment war ich wohl geistig abwesend.

Gemeint ist natürlich eine Zeile, also ein vollständiger Datensatz. Ein einzelner String stellt keinen CSV-Datensatz dar.

Antworten |