wake-up-neo.net

Python3: Schreiben von CSV-Dateien

Ich versuche, Python 3.2 auf einem Windows-Computer zu verwenden, um eine einfache CSV-Datei zu schreiben, jedoch habe ich kein Glück. Aus der csv-Moduldokumentation für Python 3.2 :

>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
...                         quotechar='|', quoting=csv.QUOTE_MINIMAL)
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

erzeugt eine Datei mit jeder Zeile, die durch die Bytefolge \r\r\n abgeschlossen wird, so dass es aussieht, als hätte jede Zeile eine zusätzliche leere Zeile, wenn Sie sie beispielsweise mit MS Excel öffnen. Dies ist keine "CSV-Datei".

Wenn ich das gleiche Beispiel für Python 2.7 in Python 3.2 versuche (wobei der große Unterschied 'w' vs. 'wb' für den Dateimodus ist), erhalte ich eine Fehlermeldung, wenn ich spamWriter.writerow versuche:

Traceback (letzter Aufruf zuletzt): Datei "", Zeile 1 in TypeError: 'str' unterstützt die Pufferschnittstelle nicht

Wie schreibe ich eine einfache CSV-Datei aus Python 3.2 auf einem Windows-Computer?

39
Mike T

Dokumentation besagt, dass Sie open('eggs.csv', 'w', newline='') verwenden sollten

http://docs.python.org/py3k/library/csv.html#id2

61

Dies funktioniert sowohl für Python 2 als auch für Python 3:

if sys.version_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')
19
Dave Burton

Wie dokumentiert in einer Fußnote :

csv.writer(csvfile, dialect='Excel', **fmtparams)

Wenn csvfile ein Dateiobjekt ist, sollte es mit newline = '' geöffnet werden.

Wenn newline = '' nicht angegeben wird, werden in Anführungszeichen eingeschlossene Zeilenumbrüche nicht korrekt interpretiert, und auf Plattformen, die\r\n Linendings beim Schreiben eines zusätzlichen\r verwenden wird hinzugefügt . Es sollte immer sicher sein, newline = '' anzugeben, da das csv-Modul eine eigene (universelle) Zeilenumbruchbehandlung durchführt.

Die folgende Variante funktioniert unter Linux und Windows:

spamWriter = csv.writer(open('eggs.csv', 'wb'), delimiter=' ', quotechar='|',
                        quoting=csv.QUOTE_MINIMAL, newline='')
spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
6
phihag

[Für Python 2.x] Diese Implementierung von spamWriter funktioniert für mich ... 

with open('assignmentresults.csv', 'wb') as csvfile:
  spamwriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
  spamwriter.writerow(["Hullo", "World"])
1
SashaZd

Um Ihre Frage direkt zu beantworten, sollten Sie den Parameter lineterminator formatierung verwenden können:

... also das Ändern dieser Zeile sollte funktionieren (ungeprüft):

>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
...                         quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')

Warum das Beispiel nicht sofort funktioniert, sieht für mich irgendwie aus wie ein Fehler.

1
Gerrat

Ich habe diesen Fehler behoben, als ich einen meiner Codes von Python 2.6.6 nach Python 3.4.3 verschob

Python2.6.6 (Ich versuche, meine CSV-Datei zu verschleiern)

with open( os.path.join(path, name) , 'r') as mycsvfile:
writer = csv.writer(open(newFilename, 'w'))

Oben funktionierte gut mit python2.6.6, funktionierte aber nicht mit python3.4.3, da beim Versuch, die python3-Datei auszuführen, einige utf-8-Unicode-Fehler auftraten

import codecs
with codecs.open(os.path.join(path, name) , 'r', encoding='ISO-8859-1') as mycsvfile:
writer = csv.writer(open(newFilename, 'w'))

Das ist es, mein Code funktioniert jetzt einwandfrei. Im Grunde betrachtet Python3 nicht den Unicode und wir müssen den Codecs-Import verwenden, damit er funktioniert. Ich hoffe, er hilft.

1
Prashanth