Schreiben einer Python-Liste von Listen in eine CSV-Datei

168

Ich habe eine lange Liste von Listen der folgenden Form ---

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

Das heißt, die Werte in der Liste sind von unterschiedlicher Art - float, int, strings. Wie schreibe ich sie in eine CSV-Datei, damit meine Ausgabe-CSV-Datei so aussieht

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

quelle
2
Mögliches Duplikat von Ergebnisse in CSV-Datei mit Python speichern
Martin Thoma

Antworten:

299

Das in Python integrierte CSV-Modul kann dies problemlos handhaben:

import csv

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

Dies setzt voraus, dass Ihre Liste so definiert ist a, wie es in Ihrer Frage steht. Sie können das genaue Format der Ausgabe-CSV über die verschiedenen optionalen Parameter csv.writer()so anpassen, wie es auf der oben verlinkten Bibliotheksreferenzseite dokumentiert ist.

Update für Python 3

import csv

with open("out.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(a)
Bernstein
quelle
88
Entfernen Sie aus Gründen der Python 3-Kompatibilität das "b" aus "wb".
Vlad V
28
Mit Python 3 - öffnen ('output.csv', 'w', newline = ''). Ich erhalte eine zusätzliche Zeile, wenn ich den Parameter newline weglasse. docs.python.org/3/library/csv.html#csv.writer
Spas
1
In Python3 musste ich open ('output.csv', 'w', newline = "") verwenden
Tim Mottram
1
WOW, dieser Python 3-Fehler ist sehr wenig hilfreich. Danke @vladV (ein byteähnliches Objekt ist erforderlich, nicht 'str'). Im Nachhinein macht es irgendwie Sinn, ist aber nicht aussagekräftig, wo man überhaupt hinschaut.
Rambatino
1
@tlalco bedeutet wahrscheinlich, dass Sie Python 2 verwenden. In diesem Fall sollten Sie den ersten Codeblock anstelle des zweiten verwenden. (Es bedeutet auch, dass Sie in Betracht ziehen sollten, zu Python 3 zu wechseln.)
Amber
35

Sie könnten verwenden 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
quelle
Ich denke nicht, sollte verwenden, pandaswenn die eingebaute Bibliothek csvdies kann.
Simin Jie
6
Ich mag Pandas, weil es mächtig ist
Dorbodwolf
9
Pandas sind zwar mächtig, aber ich werde keinen McLaren benutzen, um zum Laden an der Ecke nebenan zu fahren.
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]])

offizielle Dokumente: http://docs.python.org/2/library/csv.html

Dmitry Zagorulkin
quelle
1
Dies würde meine +1 bekommen, wenn Sie Ihre Antwort mit einigen Kommentaren erklären könnten.
Burhan Khalid
3
writerownimmt nicht mehrere Argumente.
Amber
1
>>> w.writerow ("a", "b", "c") Traceback (letzter Aufruf zuletzt): Die Datei "<stdin>", Zeile 1, in <module> TypeError: writerow () verwendet genau ein Argument (3 gegeben)
Amber
@Amber welche Version von Python benutzt du?
Dmitry Zagorulkin
4
@ Amber entschuldigen Sie mich. Ich habe []
Dmitry Zagorulkin
11

Wenn aus irgendeinem Grund wollte man es manuell tun (ohne ein Modul wie mit csv, pandas, numpyetc.):

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

Natürlich kann das Rollen Ihrer eigenen Version fehleranfällig und ineffizient sein. Deshalb gibt es normalerweise ein Modul dafür. Aber manchmal hilft es Ihnen, Ihre eigenen zu schreiben, um zu verstehen, wie sie funktionieren, und manchmal ist es einfach einfacher.

Tegan
quelle
11

Die Verwendung von csv.writer in meiner sehr großen Liste hat eine ganze Weile gedauert. Ich entschied mich für Pandas, es war schneller und einfacher zu kontrollieren und zu verstehen:

 import pandas

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

Das Gute daran ist, dass Sie etwas ändern können, um eine bessere CSV-Datei zu erstellen:

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

Die Lösung von Ambers eignet sich auch gut für numpy Arrays:

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

Wenn Sie dafür kein csvModul importieren möchten , können Sie eine Liste von Listen in eine CSV-Datei schreiben, indem Sie nur Python-integrierte Funktionen verwenden

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

Stellen Sie sicher, dass Sie angeben, lineterinator='\n'wann Sie den Writer erstellen. Andernfalls wird möglicherweise nach jeder Datenzeile eine zusätzliche leere Zeile in die Datei geschrieben, wenn die Datenquellen aus einer anderen CSV-Datei stammen ...

Hier ist meine Lösung:

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

Wie wäre es, wenn Sie die Liste der Liste in pickle ablegen und mit dem pickle-Modul wiederherstellen ? Es ist sehr praktisch.

>>> 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]]]
>>> 
Guter Wille
quelle
0

Beim Befolgen der Beispiele mit einem Zeilenumbruchparameter in der Funktion csv.writer wurde eine Fehlermeldung angezeigt. Der folgende Code hat bei mir funktioniert.

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