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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top