Während Python Migration 3, bemerkte ich einige Dateien, die wir den eingebauten in csv
jetzt b'
Präfix haben um jede Saite erzeugen mit ...schreiben Nicht-Unicode mit csv-Modul
Hier ist der Code, das sollte eine generieren CSV für eine Liste von dogs
, nach einigen von export_fields
definierten Parameter (also gibt immer Unicode-Daten):
file_content = StringIO()
csv_writer = csv.writer(
file_content, delimiter='\t', quotechar='"', quoting=csv.QUOTE_MINIMAL
)
csv_writer.writerow([
header_name.encode('cp1252') for _v, header_name in export_fields
])
# Write content
for dog in dogs:
csv_writer.writerow([
get_value(dog).encode('cp1252') for get_value, _header in export_fields
])
Das Problem ist, wenn ich file_content.getvalue()
zurückkehrt, erhalte ich:
b'Does he bark?' b'Full Name' b'Gender'
b'Sometimes, yes' b'Woofy the dog' b'Male'
Statt (Vertiefung modifiziert wurde auf SO lesbar zu sein):
'Does he bark?' 'Full Name' 'Gender'
'Sometimes, yes' 'Woofy the dog' 'Male'
ich keine encoding
Parameter im csv
Modul gefunden. Ich möchte, dass die ganze Datei in cp1252 kodiert wird, also ist es mir egal, ob die Codierung durch die Iteration der Zeilen oder die selbst erstellte Datei erfolgt.
Also weiß jemand, wie man eine richtige Zeichenfolge erzeugt, die nur cp1252-codierte Zeichenfolgen enthält?
Warum sind Sie in erster Linie kodiert? Das offene Dateiobjekt kümmert sich darum. –
@MartijnPieters Vielleicht ist meine Frage dann unvollständig: Ich möchte den String durch Django zurückgeben: 'return HttpResponse (generate_csv_file())'. Sollte ich stattdessen Kodierung auf Django-Ebene handhaben? –
Siehe meine Antwort; Sie nähern sich dem auf der falschen Ebene; tabs und quotechars müssen ebenfalls codiert werden, aber dies ist die Aufgabe der I/O-Ebene, nicht das 'csv'-Modul oder der Code, der Zeilen erzeugt. –