Seite 1 von 1

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

Verfasst: Freitag 15. April 2011, 23:10
von droptix
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

Re: csv.py TypeError 'str' does not support the buffer inter

Verfasst: Samstag 16. April 2011, 00:16
von Xynon1

Re: csv.py TypeError 'str' does not support the buffer inter

Verfasst: Samstag 16. April 2011, 07:51
von droptix
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")

Re: csv.py TypeError 'str' does not support the buffer inter

Verfasst: Samstag 16. April 2011, 15:14
von mutetella
Und wozu die Umfrage in diesem Zusammenhang?

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

mutetella