EDIT: Ich habe es in den Titel, aber nur festgestellt, dass ich es nicht im Körper erwähnt. Dies scheint spezifisch für Windows zu sein.Eine .CSV-Datei in Python schreiben, die sowohl für Python 2.7+ und Python 3.3+ in Windows funktioniert
Ich habe eine harte Zeit schreiben Ausgabe mit dem csv
Python-Modul in einem Skript, das mit Python 2.7 und 3.3 funktioniert.
Erster Versuch, die in Python 2.7 wie erwartet funktioniert:
with open('test.csv', 'wb') as csv_file:
writer = csv.DictWriter(csv_file, ['header1', 'header2'])
writer.writeheader()
for item in items:
writer.writerow(item)
Wenn jedoch die gleiche Sache in Python ausgeführt wird 3.3 Sie aufzuwickeln mit:
TypeError: 'str' does not support the buffer interface
So 'wb'
-'wt'
ich ändern und es läuft, aber jetzt habe ich eine extra leere Zeile jede zweite Zeile in der Datei.
dass zu beheben, ich ändern:
with open('test.csv', 'wt') as csv_file:
zu:
with open('test.csv', 'wt', newline='') as csv_file:
Aber jetzt bricht es Python 2.7:
TypeError: 'newline' is an invalid keyword argument for this function
Ich weiß, ich könnte nur etwas tun, wie :
try:
with open('test.csv', 'wt', newline='') as csv_file:
writer = csv.DictWriter(csv_file, ['header1', 'header2'])
writer.writeheader()
for item in items:
writer.writerow(item)
except TypeError:
with open('test.csv', 'wb') as csv_file:
writer = csv.DictWriter(csv_file, ['header1', 'header2'])
writer.writeheader()
for item in items:
writer.writerow(item)
Allerdings hat das einige ernsthaft schlechte Duplizierung.
Hat jemand eine sauberere Art, dies zu tun?
EDIT: Die Testdaten ist einfach und hat keine Zeilenumbrüche oder irgendetwas:
items = [{'header1': 'value', 'header2': 'value2'},
{'header1': 'blah1', 'header2': 'blah2'}]
Kannst du '' w'' nicht anstelle von '' wb'' oder '' wt'' verwenden? – nathancahill
Sind die Strings in Ihrer Items-Liste Unicode-Strings, wenn Sie das Skript in Python 2 ausführen? Sind die Werte immer ASCII oder könnten sie zusätzliche Zeichen enthalten, die codiert werden müssen? Selbst wenn Sie in beiden Versionen von Python denselben Code ausführen können, erhalten Sie möglicherweise nicht die gleichen Ergebnisse! – Blckknght
@Blckknght - Ich habe die Testdaten am Ende der Frage hinzugefügt. Es ist nur ASCII-Text. – Tamerz