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'}]
Kannst du nicht einfach verwenden '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

Schreibe einen Kommentar