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. À partir 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 avec chaque ligne terminée par la séquence d'octets rrn, de sorte qu'il semble que chaque ligne a une ligne vide supplémentaire lorsque vous l'ouvrez avec, par exemple, MS Excel. Ce n'est pas un "fichier CSV".

Notez, 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), je reçois une erreur quand j'essaie spamWriter.writerow:

Traceback (dernier appel le plus récent): fichier"", Ligne 1, dans TypeError: 'str' ne prend pas en charge l'interface tampon

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

39
demandé sur Mike T 2011-08-26 10:05:55

6 réponses

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

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

58
répondu alexanderlukanin13 2011-08-26 06:49:25

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')
18
répondu Dave Burton 2012-06-27 21:59:36

Comme documenté dans a note de bas de page:

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

Si csvfile est un objet file, il doit être ouvert avec newline=".

Si newline = " n'est pas spécifié, les nouvelles lignes intégrées dans les champs entre guillemets ne seront pas interprétées correctement, et sur les plates-formes qui utilisent \r\n linendings sur write Un \R supplémentaire sera ajouté. Il devrait toujours être sûr de spécifier newline=", puisque le module csv fait son propre newline (universel) manutention.

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'])
5
répondu phihag 2011-08-26 07:17:38

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

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

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

Quant à la raison pour laquelle l'exemple ne fonctionne pas hors de la boîte, un peu ressemble à un bug pour moi.

1
répondu Gerrat 2011-08-26 06:18:21

J'ai résolu cette erreur alors que je déplaçais un de mes codes de Python2.6. 6 à python3.4. 3

Python2.6. 6(j'essaie de faire de l'obscurcissement sur mon fichier csv)

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é sur python3.4.3 car je recevais des erreurs Unicode utf-8 lorsque j'ai essayé d'exécuter le fichier python3, j'ai donc apporté les modifications 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 tout, mon code fonctionne bien maintenant, fondamentalement python3 ne considère pas une partie de l'unicode et nous devons utilisez l'importation de codecs pour le faire fonctionner, espérons que cela aide..

1
répondu Prashanth 2016-11-23 19:14:37

[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
répondu SashaZd 2017-02-28 21:26:09