Ecrire une liste Python de listes dans un fichier csv

169

J'ai une longue liste de listes de la forme suivante ---

a = [[1.2,'abc',3],[1.2,'werew',4],........,[1.4,'qew',2]]

c'est-à-dire que les valeurs de la liste sont de types différents - float, int, strings.Comment puis-je l'écrire dans un fichier csv pour que mon fichier csv de sortie ressemble

1.2,abc,3
1.2,werew,4
.
.
.
1.4,qew,2

la source
2
Copie possible des résultats
Martin Thoma

Réponses:

299

Le module CSV intégré de Python peut gérer cela facilement:

import csv

with open("output.csv", "wb") as f:
    writer = csv.writer(f)
    writer.writerows(a)

Cela suppose que votre liste est définie comme atelle dans votre question. Vous pouvez modifier le format exact du CSV de sortie via les divers paramètres facultatifs csv.writer()comme indiqué dans la page de référence de la bibliothèque liée ci-dessus.

Mise à jour pour Python 3

import csv

with open("out.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(a)
ambre
la source
88
Pour la compatibilité Python 3, supprimez le "b" de "wb".
Vlad V
28
Avec Python 3 - open ('output.csv', 'w', newline = ''). J'obtiens une ligne supplémentaire si j'omets le paramètre de nouvelle ligne. docs.python.org/3/library/csv.html#csv.writer
Spas
1
En python3, j'ai dû utiliser open ('output.csv', 'w', newline = "")
Tim Mottram
1
WOW, cette erreur python 3 est très inutile. Merci @vladV (un objet de type octets est requis, pas 'str'). Cela a un peu de sens avec le recul, mais pas du tout pour savoir où regarder.
Rambatino
1
@tlalco cela signifie probablement que vous utilisez Python 2, auquel cas vous devez utiliser le premier bloc de code plutôt que le second. (Cela signifie également que vous devriez envisager de passer à Python 3.)
Ambre
35

Vous pouvez utiliser pandas:

In [1]: import pandas as pd

In [2]: a = [[1.2,'abc',3],[1.2,'werew',4],[1.4,'qew',2]]

In [3]: my_df = pd.DataFrame(a)

In [4]: my_df.to_csv('my_csv.csv', index=False, header=False)
Akavall
la source
Je ne pense pas que je devrais utiliser pandassi la bibliothèque intégrée csvpeut le faire.
Simin Jie
6
j'aime les pandas parce que c'est puissant
dorbodwolf
9
pandas est puissant, bien sûr, mais je ne vais pas utiliser une McLaren pour me rendre au magasin du coin à côté.
MI Wright
30
import csv
with open(file_path, 'a') as outcsv:   
    #configure writer to write standard csv file
    writer = csv.writer(outcsv, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
    writer.writerow(['number', 'text', 'number'])
    for item in list:
        #Write item to outcsv
        writer.writerow([item[0], item[1], item[2]])

documents officiels: http://docs.python.org/2/library/csv.html

Dmitry Zagorulkin
la source
1
Cela obtiendrait mon +1 si vous pouviez expliquer votre réponse avec quelques commentaires.
Burhan Khalid
3
writerowne prend pas plusieurs arguments.
Amber
1
>>> w.writerow ("a", "b", "c") Traceback (dernier appel le plus récent): Fichier "<stdin>", ligne 1, dans <module> TypeError: writerow () prend exactement un argument (3 donnés)
Amber
@Amber quelle version de python utilisez-vous?
Dmitry Zagorulkin
4
@Amber, excusez-moi. j'ai manqué []
Dmitry Zagorulkin
11

Si , pour quelque raison que vous vouliez le faire manuellement (sans utiliser un module comme csv, pandas, numpyetc.):

with open('myfile.csv','w') as f:
    for sublist in mylist:
        for item in sublist:
            f.write(item + ',')
        f.write('\n')

Bien sûr, lancer votre propre version peut être source d'erreurs et inefficace ... c'est généralement pourquoi il existe un module pour cela. Mais parfois, écrire les vôtres peut vous aider à comprendre comment ils fonctionnent, et parfois c'est simplement plus facile.

tegan
la source
11

L'utilisation de csv.writer dans ma très grande liste a pris un certain temps. J'ai décidé d'utiliser des pandas, c'était plus rapide et plus facile à contrôler et à comprendre:

 import pandas

 yourlist = [[...],...,[...]]
 pd = pandas.DataFrame(yourlist)
 pd.to_csv("mylist.csv")

La bonne partie, vous pouvez changer quelque chose pour créer un meilleur fichier csv:

 yourlist = [[...],...,[...]]
 columns = ["abcd","bcde","cdef"] #a csv with 3 columns
 index = [i[0] for i in yourlist] #first element of every list in yourlist
 not_index_list = [i[1:] for i in yourlist]
 pd = pandas.DataFrame(not_index_list, columns = columns, index = index)

 #Now you have a csv with columns and index:
 pd.to_csv("mylist.csv")
Dinidiniz
la source
5

La solution Ambers fonctionne également bien pour les tableaux numpy:

from pylab import *
import csv

array_=arange(0,10,1)
list_=[array_,array_*2,array_*3]
with open("output.csv", "wb") as f:
    writer = csv.writer(f)
    writer.writerows(list_)
Semjon Mössinger
la source
4

Si vous ne souhaitez pas importer de csvmodule pour cela, vous pouvez écrire une liste de listes dans un fichier csv en utilisant uniquement des modules intégrés Python

with open("output.csv", "w") as f:
    for row in a:
        f.write("%s\n" % ','.join(str(col) for col in row))
jaune01
la source
3

Assurez-vous d'indiquer lineterinator='\n'lors de la création de l'écrivain; sinon, une ligne vide supplémentaire pourrait être écrite dans le fichier après chaque ligne de données lorsque les sources de données proviennent d'un autre fichier csv ...

Voici ma solution:

with open('csvfile', 'a') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter='    ',quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
for i in range(0, len(data)):
    spamwriter.writerow(data[i])
yashi wang
la source
3

Que diriez-vous de vider la liste de la liste dans pickle et de la restaurer avec le module pickle ? C'est assez pratique.

>>> import pickle
>>> 
>>> mylist = [1, 'foo', 'bar', {1, 2, 3}, [ [1,4,2,6], [3,6,0,10]]]
>>> with open('mylist', 'wb') as f:
...     pickle.dump(mylist, f) 


>>> with open('mylist', 'rb') as f:
...      mylist = pickle.load(f)
>>> mylist
[1, 'foo', 'bar', {1, 2, 3}, [[1, 4, 2, 6], [3, 6, 0, 10]]]
>>> 
Bonne volonté
la source
0

J'ai reçu un message d'erreur en suivant les exemples avec un paramètre de nouvelle ligne dans la fonction csv.writer. Le code suivant a fonctionné pour moi.

 with open(strFileName, "w") as f:
    writer = csv.writer(f, delimiter=',',  quoting=csv.QUOTE_MINIMAL)
    writer.writerows(result)
Jie
la source