Schreiben ein .CSV-Datei in Python, das funktioniert sowohl für Python 2.7+ und Python 3.3+ in Windows
EDIT: ich habe es in den Titel, sondern nur merkte ich nicht erwähnt, dass es in den Körper. Dies scheint spezifisch für Windows.
Ich habe eine harte Zeit mit dem schreiben die Ausgabe über die csv
Python-Moduls in einem Skript, das funktioniert mit Python 2.7 und 3.3.
Versuchen Sie zuerst, welche arbeiten wie erwartet in Python 2.7:
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, wenn die gleiche Sache ist in Python 3.3 Sie wind-up mit:
TypeError: 'str' does not support the buffer interface
So, ich ändern 'wb'
zu 'wt'
und es läuft, aber jetzt habe ich eine zusätzliche leere Zeile, jede weitere Zeile in der Datei.
Zu beheben, die ich ändern:
with open('test.csv', 'wt') as csv_file:
:
with open('test.csv', 'wt', newline='') as csv_file:
Aber jetzt, es bricht Python 2.7:
TypeError: 'newline' is an invalid keyword argument for this function
Ich weiß, ich könnte nur so etwas tun:
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)
Jedoch, dass einige ernsthaft schlechte Vervielfältigung.
Hat jemand eine bessere Möglichkeit, dies zu tun?
EDIT: Die test-Daten ist einfach und hat keine Zeilenumbrüche oder nichts:
items = [{'header1': 'value', 'header2': 'value2'},
{'header1': 'blah1', 'header2': 'blah2'}]
'w'
statt 'wb'
oder 'wt'
?Sind die Zeichenfolgen in Ihrer
items
Liste unicode
Saiten, wenn Sie das script in Python 2? Sind die Werte immer ASCII-oder können Sie zusätzliche Zeichen, die müssen codiert werden? Auch wenn Sie sind in der Lage, führen Sie den gleichen code unter beiden Versionen von Python, die Sie vielleicht nicht die gleichen Ergebnisse erhalten!Ich habe den test-Daten auf den Grund der Frage. Es ist nur ASCII-text.
InformationsquelleAutor Tamerz | 2015-04-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich versucht, ein paar Möglichkeiten. Soweit ich das sehen kann, einfach mit
'w'
könnte eine Lösung sein:Sie erhalten zusätzliche neue Linien, da haben Sie extra neue Linien in Ihre Daten...
.strip()
sein könnte, was Sie brauchen.Ich habe versucht, mit einigen fake-Daten und es stellte sich heraus gut. Also ich denke, es ist etwas falsch mit Ihren Daten, zu.
w
ist das gleiche wiewt
Hinzugefügt von Testdaten zur ursprünglichen Frage. Sie können sehen, es ist nichts aber ein paar strings in einem dict.
InformationsquelleAutor skyline75489
Hier ist ein einfacher generischer Weise:
Hier gilt der Grundsatz, nicht zu versuchen, zu kämpfen, die Unterschiede zwischen Python 2 und 3, sondern um bedingten code. Sie können nur so weit gehen, in den code zu schreiben, ohne diese Art von test, früher oder später müssen Sie zum testen der Python-version.
**kwargs
beteiligten eine gute Lösung sein. Es ist immer noch nicht schön, aber deutlich besser als all die Vervielfältigung, die ich hatte. Diese wird absolut in meinem Szenario. Danke.Ich ging mit der Antwort, dass @skyline75489 gab, aber ich immer noch wie diese in Zukunft zu verwenden. Es gibt Zeiten, die ich brauchte, genau das zu tun, aber nicht wissen, der beste Weg,.
Check out meine Antwort, um eine ähnliche Frage. Es funktioniert in beiden Versionen von Python und Griffen das öffnen von Dateien zum Lesen und schreiben (plus. wie
open()
, standardmäßig auf read-Modus, wenn man nicht explizit angegeben). Es auch erfordert nicht die Verwendung von globalen Variablen.InformationsquelleAutor cdarke