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

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)

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)

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


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.


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")

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_)

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))

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])

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]]]
>>> 

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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.