2011-08-26 18 views
38

Estoy tratando de usar Python 3.2 en una computadora Windows para escribir un archivo CSV simple, sin embargo, no estoy teniendo suerte. Desde el csv module documentation for Python 3.2:Python3: escribiendo archivos 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 archivo con cada línea terminada por la secuencia de bytes \r\r\n, así que parece que cada línea tiene una línea extra vacío cuando se abre con, por ejemplo, MS Excel. Este no es un "archivo CSV".

Nota, si trato de la same example for Python 2.7 en Python 3.2 (donde la gran diferencia es 'w' vs 'wb' para el modo de archivo), me sale un error cuando intento spamWriter.writerow:

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

¿Cómo escribo una archivo CSV simple de Python 3.2 en una computadora con Windows?

+3

el problema parece ser específico para Windows . Funciona bien en Linux. – phihag

Respuesta

53

Documentación dice que se debe utilizar open('eggs.csv', 'w', newline='')

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

+2

Ah, parece que tomé una versión un poco más antigua (-0.1) de la documentación (compárese con [3.2] (http: // docs.python.org/release/3.2/library/csv.html#csv.writer) versus [3.2.1] (http://docs.python.org/release/3.2.1/library/csv.html#csv .writer)) –

1

para responder directamente a su pregunta, usted debería ser capaz de utilizar el parámetro lineterminator formato:

... así que la modificación de esta línea debe trabajar (no probado):

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

cuanto a por qué el ejemplo no funciona de fábrica, parece un error para mí.

+0

Esta es la única respuesta aquí que funcionó para mí.Y cinco años después, los ejemplos aún no funcionan de inmediato :-( – Rup

5

Como documented en 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 siguiente variante funciona en Linux y 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

Obtengo un 'TypeError: 'newline' es un argumento de palabra clave inválido para esta función' cuando intento hacer esto en py34 –

17

Este será trabajar tanto en Python 2 y Python 3:

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

[Para Python 2.x] Esta implementación de spamWriter está funcionando para mí ...

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

Esto no es una respuesta para Python 3, lo que hace que" TypeError: 'str' no no es compatible con la interfaz de buffer " –

1

resolví este error como me estaba moviendo uno de mis códigos de Python2.6.6 a python3.4.3

Python2.6.6 (estoy tratando de hacer algo de ofuscación en mi csvfile)

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

trabajó bien con python2.6.6 pero no funcionaba en python3.4.3 cuando estaba a unos UTF-8 Unicode errores cuando he intentado ejecutar el archivo python3, por lo que hizo el siguiente 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')) 

Eso es todo, mi código funciona bien ahora, básicamente python3 no está teniendo en cuenta algunos de los unicode y tenemos que utilizar los códecs de importación para hacer que funcione, creo que sirve ..