2011-08-26 27 views
38

Sto provando a utilizzare Python 3.2 su un computer Windows per scrivere un semplice file CSV, tuttavia non ho fortuna. Dal csv module documentation for Python 3.2:Python3: scrittura di file CSV

>>> 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']) 

produce un file con ogni riga che termina con la sequenza di byte \r\r\n, così sembra che ogni linea ha una linea aggiuntiva vuoto quando lo si apre con, per esempio, MS Excel. Questo non è un "file CSV".

nota, se provo l'same example for Python 2.7 in Python 3.2 (in cui la grande differenza è 'w' vs 'wb' per la modalità file), ottengo un errore quando provo spamWriter.writerow:

Traceback (most recent call last): File "", line 1, in TypeError: 'str' does not support the buffer interface

Come faccio a scrivere un semplice file CSV da Python 3.2 su un computer Windows?

+3

il problema sembra essere specifico per Windows . Funziona bene su Linux. – phihag

risposta

53

documentazione dice che si dovrebbe usare open('eggs.csv', 'w', newline='')

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

+2

Ah, sembra che ho preso una versione leggermente più vecchia (-0.1) della documentazione (confronta [3.2] (http: // docs.python.org/release/3.2/library/csv.html#csv.writer) vs [3.2.1] (http://docs.python.org/release/3.2.1/library/csv.html#csv .writer)) –

1

Per rispondere direttamente alla tua domanda, si dovrebbe essere in grado di utilizzare il parametro lineterminator formattazione:

... quindi modificare questa linea dovrebbe funzionare (non testata):

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

Per quanto riguarda il motivo per cui l'esempio non funziona immediatamente, sembra un bug per me.

+0

Questa è l'unica risposta qui che ha funzionato per me.E cinque anni dopo gli esempi ancora non funzionano subito :-( – Rup

5

Come documented in un footnote:

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

If csvfile is a file object, it should be opened with newline=''.

If newline='' is not specified, newlines embedded inside quoted fields will not be interpreted correctly, and on platforms that use \r\n linendings on write an extra \r will be added. It should always be safe to specify newline='', since the csv module does its own (universal) newline handling.

la seguente variante funziona su Linux e 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']) 
+4

Ottengo un 'TypeError: 'newline' è un argomento di parole chiave non valido per questa funzione' quando si cerca di farlo in py34. –

17

Questo volere lavorare su entrambi Python 2 e Python 3:

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

[Per Python 2.x] Questa implementazione di spamWriter sta lavorando per me ...

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

Questa non è una risposta per Python 3, che solleva" TypeError: 'str' fa non supporta l'interfaccia buffer " –

1

ho risolto questo errore come mi muovevo uno dei miei codici da Python2.6.6 a python3.4.3

Python2.6.6 (sto cercando di fare un po 'confusione sul mio csvfile)

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

Sopra lavorato bene con python2.6.6, ma non ha funzionato sul python3.4.3 come mi è stato sempre qualche utf-8 errori unicode quando ho provato ad eseguire il file python3, così ho fatto la sottostante cambia Python3.4.4

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

Questo è tutto, il mio codice funziona bene ora, in fondo python3 non sta prendendo in considerazione alcuni dei unicode e abbiamo bisogno di utilizzare i codec di importazione per farlo lavorare, spero che aiuta ..

Problemi correlati