csv.py TypeError 'str' does not support the buffer interface

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

Welche Python-Version benutzt ihr?

Python 2.x
6
55%
Python 3.x
1
9%
Beide
4
36%
 
Insgesamt abgegebene Stimmen: 11
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

In Python 2.7 geht's, in Python 3.2 nicht mehr, ich kann mir das nicht erklären. Ich habe mittlerweile 3 Tage recherchiert und keine Lösung geunden. Der Fehler kommt reproduzierbar. De facto kann ich das csv-Modul in Python 3 nicht mehr benutzen. Vielleicht habt ihr eine Idee?

Beispiel-Code:

Code: Alles auswählen

import csv

fieldnames = ["name", "color"]
row1 = ["John", "blue"]
row2 = ["Jane", "pink"]

filename = "out.csv"
f = open(filename, "wb")
w = csv.DictWriter(f, fieldnames)

header = dict(zip(fieldnames, fieldnames))
rows = [dict(zip(fieldnames, row)) for row in [row1, row2]]

w.writerow(header)
w.writerows(rows)

f.close()
Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "csvtest.py", line 14, in <module>
    w.writerow(header)
  File "C:\Python32\lib\csv.py", line 153, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
TypeError: 'str' does not support the buffer interface
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ich hab's. Danke, dass du mich nochmal mit der Nase drauf gestubst hast... Natürlich war ich in der alten und neuen Doku unterwegs, habe aber den Unterschied echt nicht gesehen.

Allerdings finde ich es schon ganz schön gemein von dir, die Lösung nicht auszusprechen :) Denn ich suche mir seit Tagen hier den Wolf und dann kommt ein Weiser und antwortet in Rätseln.

Für alle anderen wie mich, die Lösung ist: In Python 2.x musst du, um mit dem csv-Modul (unter Windows) eine Datei zu schreiben, das File-Objekt binär öffnen. Die Doku sagt dazu: "If csvfile is a file object, it must be opened with the ‘b’ flag on platforms where that makes a difference.". Python 3.x unterscheidet nun ganz strikt zwischen Strings und Bytes. Wenn ich in Python 3.x das File-Objekt binär öffne, kann ich keine Strings reinschreiben.

Man entferne also das "b" Flag und schon geht's:

Code: Alles auswählen

f = open(filename, "w")
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Und wozu die Umfrage in diesem Zusammenhang?

Wenngleich ich Umfragen liebe und mich speziell diese Frage auch interessiert... :wink:

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten