Ich habe eine lange Liste von Listen des folgenden Formulars ---
a = [[1.2,'abc',3],[1.2,'werew',4],........,[1.4,'qew',2]]
die Werte in der Liste sind von unterschiedlichen Typen - float, int, strings. Wie schreibe ich sie in eine CSV-Datei, damit meine CSV-Datei so aussieht
1.2,abc,3
1.2,werew,4
.
.
.
1.4,qew,2
Pythons eingebautes 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 als a
definiert ist, wie in Ihrer Frage. Sie können das genaue Format der Ausgabe-CSV über die verschiedenen optionalen Parameter zu csv.writer()
anpassen, wie auf der oben verlinkten Bibliotheksreferenzseite dokumentiert.
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
Sie könnten pandas
verwenden:
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)
Die Verwendung von csv.writer in meiner sehr großen Liste hat ziemlich lange 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")
Der gute Teil, den Sie ä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")
Wenn Sie es aus irgendeinem Grund manuell tun wollten (ohne ein Modul wie csv
, pandas
, numpy
usw.) zu verwenden:
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 können Sie selbst schreiben, wie sie funktionieren, und manchmal ist es auch einfacher.
Die Lösung von Ambers funktioniert auch 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_)
Stellen Sie sicher, dass Sie beim Erstellen des Schreibers lineterinator='\n'
angeben. Andernfalls könnte nach jeder Datenzeile eine zusätzliche leere Zeile in die Datei geschrieben werden, wenn Datenquellen aus anderen CSV-Dateien 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])
Wie wäre es, wenn Sie die Liste in pickle ablegen und sie mit pickle module wiederherstellen? Das 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]]]
>>>
Wenn Sie das csv
-Modul dafür nicht importieren möchten, können Sie eine Liste von Listen in eine CSV-Datei schreiben, indem Sie nur Python Built-Ins verwenden
with open("output.csv", "w") as f:
for row in a:
f.write("%s\n" % ','.join(str(col) for col in row))