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:
| 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:
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:
Kann mir jemand erklären, wie man das macht? Viele Grüße Tronde
|
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
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
(Themenstarter)
Anmeldungsdatum: 23. November 2006
Beiträge: 1640
|
Guten Morgen, habt vielen Dank für eure Hilfe. Nun habe ich es verstanden. 💡 MfG Tronde
|
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
Anmeldungsdatum: 27. Juni 2005
Beiträge: 662
Wohnort: bremen
|
row heißt übersetzt Zeile nicht Spalte 😀
|
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.
|