256 votes

Créer un fichier .csv avec les valeurs d'une liste Python

J'essaie de créer un fichier .csv avec les valeurs d'une liste Python. Lorsque j'imprime les valeurs de la liste, elles sont toutes unicode ( ?), c'est-à-dire qu'elles ressemblent à quelque chose comme ceci

[u'value 1', u'value 2', ...]

Si j'itère à travers les valeurs de la liste, c'est-à-dire for v in mylist: print v ils semblent être du texte brut.

Et je peux mettre un , entre chaque avec print ','.join(mylist)

Et je peux faire une sortie vers un fichier, c'est à dire

myfile = open(...)
print >>myfile, ','.join(mylist)

Mais je veux faire une sortie vers un CSV et avoir des délimiteurs autour des valeurs dans la liste, par ex.

"value 1", "value 2", ... 

Je n'arrive pas à trouver un moyen simple d'inclure les délimiteurs dans le formatage, par exemple, j'ai essayé par le biais de la fonction join déclaration. Comment puis-je faire cela ?

0 votes

Merci à tous, j'ai combiné les idées de quelques réponses pour résoudre ma question :) J'utilise maintenant le module csv pour écrire les données [...] directement dans un fichier import csv data = [...] myfile = open(..., 'wb') out = csv.writer(open("myfile.csv", "w"), delimiter=',',quoting=csv.QUOTE_ALL) out. writerow(data) fonctionne bien, je construis mes data[] en extrayant des données d'une feuille de calcul à l'aide de xlrd et le module csv les écrit dans un fichier avec les bons délimiteurs ; tout va bien :) merci encore à vous tous.

1 votes

Une approche plus récente pourrait consister à utiliser pandas

0 votes

Pour les utilisateurs de Python 3.4, c'est ce qui a le mieux fonctionné pour moi : stackoverflow.com/questions/25022677/

317voto

Alex Martelli Points 330805
import csv

with open(..., 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

Edition : cela ne fonctionne qu'avec python 2.x.

Pour le faire fonctionner avec python 3.x, remplacez wb avec w ( voir cette réponse SO )

with open(..., 'w', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)

11 votes

Notez que le csv dans la version 2.x ne gère pas correctement les unicodes ; consultez la documentation du module pour des exemples sur la façon de gérer cela. docs.python.org/library/csv.html

21 votes

Vous pouvez également utiliser wr.writerows(list)

0 votes

Quelle est la différence entre writerow et writerows ?

125voto

Cristian Garcia Points 805

Voici une version sécurisée de celle d'Alex Martelli :

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

5 votes

Plus 1 pour l'utilisation with en s'assurant que le fichier est fermé une fois terminé

0 votes

Si je l'utilise à l'intérieur d'une boucle for, le bloc with doit-il être entièrement imbriqué dans la boucle for ? Ou serait-il plus efficace de n'avoir que wr.writerow(my_list) à l'intérieur de la boucle ?

1 votes

@crypdick vous ne devez absolument pas mettre le bloc entier dans la boucle. Ouvrez le fichier, puis écrivez chaque ligne dans une boucle. Il n'y a pas besoin d'ouvrir le fichier n fois pour écrire n lignes.

12voto

vy32 Points 6298

Utilisez la fonction csv pour lire et écrire des fichiers délimités par des virgules ou des tabulations. Le module csv est préféré parce qu'il vous donne un bon contrôle sur les citations.

Par exemple, voici l'exemple travaillé pour vous :

import csv
data = ["value %d" % i for i in range(1,4)]

out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)
out.writerow(data)

Produit :

"value 1","value 2","value 3"

5 votes

Produit un fichier vide pour moi

0 votes

La première exécution est vide et vous ne pouvez pas non plus la supprimer à ce moment-là, car elle est alors ouverte dans python. Deuxième exécution (ou plus précisément : out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)) remplit les données, peu importe si vous mettez open("myfile.csv","w") ou un nouveau fichier open("myfile2.csv","w") . Il semble que l'objet out ne puisse pas traiter l'objet fichier construit lors de l'exécution, mais qu'il stocke le processus de sortie comme une tâche à faire. En d'autres termes : l'objet out stocke l'objet fichier lors de la première exécution mais n'écrit que lorsque l'objet fichier existe déjà ! Voir la bonne solution ci-dessous @Saurabh Adhikary

8voto

Robert Christie Points 7323

Vous pouvez utiliser la méthode string.join dans ce cas.

Répartis sur quelques lignes pour plus de clarté - voici une session interactive

>>> a = ['a','b','c']
>>> first = '", "'.join(a)
>>> second = '"%s"' % first
>>> print second
"a", "b", "c"

Ou comme une seule ligne

>>> print ('"%s"') % '", "'.join(a)
"a", "b", "c"

Cependant, vous pouvez avoir un problème si vos chaînes de caractères ont des guillemets intégrés. Si c'est le cas, vous devrez décider comment les échapper.

El Module CSV peut s'occuper de tout cela pour vous, en vous permettant de choisir entre différentes options de citation (tous les champs, seulement les champs avec des guillemets et des séparateurs, seulement les champs non numériques, etc.) et la façon d'esacper les caractères de contrôle (guillemets doubles, ou chaînes échappées). Si vos valeurs sont simples, string.join sera probablement OK mais si vous devez gérer beaucoup de cas limites, utilisez le module disponible.

3voto

Utilisez le csv module .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X