2011-08-26 5 views
38

J'essaie d'utiliser Python 3.2 sur un ordinateur Windows pour écrire un simple fichier CSV, mais je n'ai pas de chance. De l'csv module documentation for Python 3.2:Python3: écrire des fichiers 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']) 

produit un fichier à chaque ligne terminée par la séquence d'octets \r\r\n, donc il semble que chaque ligne a une ligne vide supplémentaire lorsque vous ouvrez avec, par exemple, MS Excel. Ce n'est pas un "fichier CSV".

Remarque, si je tente le same example for Python 2.7 en Python 3.2 (où la grande différence est 'w' vs 'wb' pour le mode de fichier), je reçois une erreur lorsque je tente spamWriter.writerow:

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

Comment puis-je écrire un simple fichier CSV à partir de Python 3.2 sur un ordinateur Windows?

+3

le problème semble être spécifique à Windows . Fonctionne bien sur Linux. – phihag

Répondre

53

Documentation dit que vous devez utiliser open('eggs.csv', 'w', newline='')

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

+2

Ah, il semble que j'ai pris une version légèrement plus ancienne (-0.1) de la documentation (comparer [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

Pour répondre directement à votre question, vous devriez être en mesure d'utiliser le paramètre lineterminator de formatage:

... afin de modifier cette ligne devrait fonctionner (non testé):

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

Quant à savoir pourquoi l'exemple ne fonctionne pas out-of-the-box, ressemble un peu à un bug pour moi.

+0

C'est la seule réponse ici qui a fonctionné pour moi.Et cinq ans plus tard les exemples ne fonctionnent toujours pas out of the box :-( – Rup

5

Comme documented dans 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 variante suivante fonctionne sous Linux et 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

Je reçois un 'TypeError: 'newline' est un argument mot-clé invalide pour cette fonction' en essayant de le faire dans py34 –

17

Cette volonté travailler à la fois Python 2 et Python 3:

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

[Pour Python 2.x] Cette mise en œuvre de spamWriter travaille pour moi ...

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

Ce n'est pas une réponse pour Python 3, qui soulève" TypeError: 'str' fait ne supporte pas l'interface tampon " –

1

Je résolus cette erreur que je bougeais un de mes codes de Python2.6.6 à python3.4.3

Python2.6.6 (je suis en train de faire des faux-fuyants sur mon csvfile)

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

Au-dessus a bien fonctionné avec python2.6.6 mais ne fonctionne pas sur python3.4.3 que je recevais des utf-8 erreurs unicode quand j'ai essayé d'exécuter le fichier python3, donc je fait les changements ci-dessous 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')) 

C'est, mon code fonctionne bien maintenant, essentiellement python3 n'est pas compte tenu de certains des unicode et nous avons besoin d'utiliser les codecs Importer pour le faire fonctionner, espérons que cela aide ..