Scrivere un elenco di elenchi Python in un file CSV


168

Ho un lungo elenco di elenchi del seguente modulo ---

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

vale a dire i valori nell'elenco sono di diversi tipi: float, int, stringhe. Come posso scriverlo in un file CSV in modo che il mio file CSV di output sia simile

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

Risposte:


299

Il modulo CSV integrato di Python è in grado di gestirlo facilmente:

import csv

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

Ciò presuppone che l'elenco sia definito come a, come è nella tua domanda. È possibile modificare il formato esatto del CSV di output tramite i vari parametri opzionali sucsv.writer() come documentato nella pagina di riferimento della libreria collegata sopra.

Aggiornamento per Python 3

import csv

with open("out.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(a)

88
Per la compatibilità con Python 3, rimuovere la "b" da "wb".
Vlad V,

28
Con Python 3 - apri ('output.csv', 'w', newline = ''). Ottengo una riga in più se ometto il parametro newline. docs.python.org/3/library/csv.html#csv.writer
Spa

1
In python3 ho dovuto usare open ('output.csv', 'w', newline = "")
Tim Mottram

1
WOW, l'errore di Python 3 non è molto utile. Grazie @vladV (è richiesto un oggetto simile a byte, non 'str'). In un certo senso ha senso col senno di poi, ma non informativo su dove guardare tutto.
Rambatino,

1
@tlalco probabilmente significa che stai usando Python 2, nel qual caso dovresti usare il primo blocco di codice anziché il secondo. (Significa anche che dovresti prendere in considerazione il passaggio a Python 3.)
Ambra

35

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

Non credo che dovrei usare pandasse la libreria integrata csvpuò farlo.
Simin Jie,

6
mi piacciono i panda perché è potente
dorbodwolf il

9
Panda è potente, certo, ma non userò una McLaren per andare al negozio all'angolo della porta accanto.
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]])

documenti ufficiali: http://docs.python.org/2/library/csv.html


1
Questo otterrebbe il mio +1 se potessi spiegare la tua risposta con alcuni commenti.
Burhan Khalid, il

3
writerownon accetta più argomenti.
Ambra

1
>>> w.writerow ("a", "b", "c") Traceback (ultima chiamata più recente): il file "<stdin>", riga 1, in <module> TypeError: writerow () accetta esattamente un argomento (3 dato)
Ambra

@Amber quale versione di Python usi?
Dmitry Zagorulkin, il

4
@Amber mi scusi. mi sono perso []
Dmitry Zagorulkin il

11

Se per qualsiasi motivo si voleva farlo manualmente (senza l'utilizzo di un modulo simile csv, pandas, numpyetc.):

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

Ovviamente, distribuire la tua versione può essere soggetto a errori e inefficiente ... di solito è per questo che esiste un modulo. Ma a volte scrivere il tuo può aiutarti a capire come funzionano, a volte è più semplice.


11

L'uso di csv.writer nella mia lista molto ampia ha richiesto parecchio tempo. Ho deciso di usare i panda, era più veloce e più facile da controllare e capire:

 import pandas

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

La parte buona è che puoi cambiare qualcosa per creare un file CSV migliore:

 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 soluzione di Ambers funziona anche con array intorpiditi:

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

Se non si desidera importare il csvmodulo per questo, è possibile scrivere un elenco di elenchi in un file CSV utilizzando solo i built-in Python

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

3

Assicurati di indicare lineterinator='\n'quando crei lo scrittore; in caso contrario, una riga vuota aggiuntiva potrebbe essere scritta nel file dopo ogni riga di dati quando le origini dati provengono da altri file CSV ...

Ecco la mia soluzione:

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

Che ne dite di scaricare l'elenco dell'elenco in sottaceto e ripristinarlo con il modulo pickle ? È abbastanza conveniente.

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

Ho ricevuto un messaggio di errore quando seguivo gli esempi con un parametro newline nella funzione csv.writer. Il seguente codice ha funzionato per me.

 with open(strFileName, "w") as f:
    writer = csv.writer(f, delimiter=',',  quoting=csv.QUOTE_MINIMAL)
    writer.writerows(result)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.