web-dev-qa-db-fra.com

Python3: écriture de fichiers csv

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 la documentation du module csv pour 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'])

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

Notez que si j'essaie le même exemple pour Python 2.7 dans Python 3.2 (où la grande différence est 'w' vs 'wb' pour le mode fichier), j'obtiens une erreur lorsque j'essaie spamWriter.writerow:

Traceback (dernier appel le plus récent): Fichier "", ligne 1, dans TypeError: "str" ​​ne prend pas en charge l'interface de mémoire tampon

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

39
Mike T

La documentation indique que vous devez utiliser open('eggs.csv', 'w', newline='')

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

61
alexanderlukanin13

Cela fonctionnera à la fois sur Python 2 et Python 3:

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

Comme documenté dans un note de bas de page :

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

Si csvfile est un objet fichier, il devrait être ouvert avec newline = ''.

Si newline = '' n'est pas spécifié, les nouvelles lignes incorporées dans des champs entre guillemets ne seront pas interprétées correctement, et sur les plates-formes qui utilisent\r\n linendings lors de l'écriture d'un extra\r sera ajouté . Il est toujours prudent de spécifier newline = '', car le module csv gère lui-même sa nouvelle ligne (universelle).

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

[Pour Python 2.x] Cette implémentation de spamWriter fonctionne pour moi ... 

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

Pour répondre directement à votre question, vous devriez pouvoir utiliser le paramètre lineterminator formating:

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

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

En ce qui concerne la raison pour laquelle l'exemple ne fonctionne pas immédiatement, cela ressemble à un bug pour moi.

1
Gerrat

J'ai résolu cette erreur en déplaçant l'un de mes codes de Python2.6.6 vers python3.4.3

Python2.6.6 (j'essaie de faire de l'obscurcissement sur mon csvfile)

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

Ci-dessus a bien fonctionné avec python2.6.6 mais n'a pas fonctionné sous python3.4.3 car des erreurs unicode utf-8 se présentaient lorsque j'ai essayé d'exécuter le fichier python3.

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

Ça y est, mon code fonctionne bien maintenant, fondamentalement python3 n’envisage pas une partie de l’unicode et nous devons utiliser l’importation de codecs pour le faire fonctionner, espérons que cela aide….

1
Prashanth