Erstellen Sie eine CSV-Datei mit Werten aus einer Python-Liste
Frage
Ich versuche, eine CSV-Datei mit den Werten aus einer Python-Liste zu erstellen.Wenn ich die Werte in der Liste ausdrucke, sind sie alle Unicode (?), d. h.sie sehen ungefähr so aus
[u'value 1', u'value 2', ...]
Wenn ich die Werte in der Liste durchlaufe, d. h. for v in mylist: print v
es scheint sich um Klartext zu handeln.
Und ich kann ein ,
zwischen jedem mit print ','.join(mylist)
Und ich kann in eine Datei ausgeben, d.h.
myfile = open(...)
print >>myfile, ','.join(mylist)
Aber ich möchte in eine CSV-Datei ausgeben und die Werte in der Liste mit Trennzeichen versehen, z. B.
"value 1", "value 2", ...
Ich finde keine einfache Möglichkeit, die Trennzeichen in die Formatierung einzubeziehen, z. B.Ich habe es durch probiert join
Stellungnahme.Wie kann ich das machen?
Lösung
import csv
with open(..., 'wb') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)
Bearbeiten:Dies funktioniert nur mit Python 2.x.
Damit es mit Python 3.x funktioniert, ersetzen Sie es wb
mit w
(siehe diese SO-Antwort)
with open(..., 'w', newline='') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)
Andere Tipps
Hier ist eine sichere Version von Alex Martellis:
import csv
with open('filename', 'wb') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)
Die beste Option, die ich gefunden habe, war die Verwendung von savetxt
von dem numpy
Modul:
import numpy as np
np.savetxt("file_name.csv", data1, delimiter=",", fmt='%s', header=header)
Falls Sie mehrere Listen haben, die gestapelt werden müssen
np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)
Für einen anderen Ansatz können Sie verwenden Datenrahmen In Pandas:Und es kann die Daten ganz einfach in eine CSV-Datei übertragen, genau wie der folgende Code:
import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)
Verwenden Sie Pythons csv
Modul zum Lesen und Schreiben von durch Kommas oder Tabulatoren getrennten Dateien.Das CSV-Modul wird bevorzugt, da es Ihnen eine gute Kontrolle über die Angebotserstellung bietet.
Hier ist zum Beispiel das ausgearbeitete Beispiel für Sie:
import csv
data = ["value %d" % i for i in range(1,4)]
out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)
out.writerow(data)
Produziert:
"value 1","value 2","value 3"
In diesem Fall könnten Sie die Methode string.join verwenden.
Der Übersichtlichkeit halber auf mehrere Zeilen aufgeteilt – hier ist eine interaktive Sitzung
>>> a = ['a','b','c']
>>> first = '", "'.join(a)
>>> second = '"%s"' % first
>>> print second
"a", "b", "c"
Oder als einzelne Zeile
>>> print ('"%s"') % '", "'.join(a)
"a", "b", "c"
Möglicherweise besteht jedoch ein Problem darin, dass Ihre Zeichenfolgen eingebettete Anführungszeichen enthalten.Wenn dies der Fall ist, müssen Sie entscheiden, wie Sie ihnen entkommen können.
Der CSV-Modul kann dies alles für Sie erledigen und Ihnen die Wahl zwischen verschiedenen Anführungszeichenoptionen (alle Felder, nur Felder mit Anführungszeichen und Trennzeichen, nur nicht numerische Felder usw.) und die Möglichkeit geben, Steuerzeichen (doppelte Anführungszeichen oder maskierte Zeichenfolgen) zu umgehen. .Wenn Ihre Werte einfach sind, ist string.join wahrscheinlich in Ordnung, aber wenn Sie viele Randfälle verwalten müssen, verwenden Sie das verfügbare Modul.
Jupyter-Notizbuch
Nehmen wir an, Ihre Liste ist A
Dann können Sie die folgende Anzeige codieren, Sie erhalten sie als CSV-Datei (nur Spalten!)
R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()
Sie sollten auf jeden Fall das CSV-Modul verwenden, aber die Chancen stehen gut, dass Sie Unicode schreiben müssen.Für diejenigen, die Unicode schreiben müssen, ist dies die Klasse aus der Beispielseite, die Sie als Util-Modul verwenden können:
import csv, codecs, cStringIO
class UTF8Recoder:
"""
Iterator that reads an encoded stream and reencodes the input to UTF-8
"""
def __init__(self, f, encoding):
self.reader = codecs.getreader(encoding)(f)
def __iter__(self):
return self
def next(self):
return self.reader.next().encode("utf-8")
class UnicodeReader:
"""
A CSV reader which will iterate over lines in the CSV file "f",
which is encoded in the given encoding.
"""
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
f = UTF8Recoder(f, encoding)
self.reader = csv.reader(f, dialect=dialect, **kwds)
def next(self):
row = self.reader.next()
return [unicode(s, "utf-8") for s in row]
def __iter__(self):
return self
class UnicodeWriter:
"""
A CSV writer which will write rows to CSV file "f",
which is encoded in the given encoding.
"""
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
# Redirect output to a queue
self.queue = cStringIO.StringIO()
self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
self.stream = f
self.encoder = codecs.getincrementalencoder(encoding)()
def writerow(self, row):
self.writer.writerow([s.encode("utf-8") for s in row])
# Fetch UTF-8 output from the queue ...
data = self.queue.getvalue()
data = data.decode("utf-8")
# ... and reencode it into the target encoding
data = self.encoder.encode(data)
# write to the target stream
self.stream.write(data)
# empty queue
self.queue.truncate(0)
def writerows(self, rows):
for row in rows:
self.writerow(row)
Hier ist eine weitere Lösung, die das nicht erfordert csv
Modul.
print ', '.join(['"'+i+'"' for i in myList])
Beispiel :
>>> myList = [u'value 1', u'value 2', u'value 3']
>>> print ', '.join(['"'+i+'"' for i in myList])
"value 1", "value 2", "value 3"
Wenn die ursprüngliche Liste jedoch einige enthält, werden diese nicht maskiert.Bei Bedarf ist es möglich, eine Funktion aufzurufen, um es wie folgt zu umgehen:
print ', '.join(['"'+myFunction(i)+'"' for i in myList])
Diese Lösung klingt verrückt, funktioniert aber reibungslos
import csv
with open('filename', 'wb') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
wr.writerow(mylist)
Die Datei wird vom CSVWriter geschrieben, daher bleiben die CSV-Eigenschaften erhalten, d. h.Komma getrennt.Das Trennzeichen hilft im Hauptteil, indem es Listenelemente jedes Mal in die nächste Zeile verschiebt.