Erstellen Sie eine CSV-Datei mit Werten aus einer Python-Liste


180

Ich versuche, eine CSV-Datei mit den Werten aus einer Python-Liste zu erstellen. Wenn ich die Werte in der Liste drucke, sind sie alle Unicode (?), Das heißt, sie sehen ungefähr so ​​aus

[u'value 1', u'value 2', ...]

Wenn ich die Werte in der Liste durchlaufe, for v in mylist: print vscheinen sie nur Text zu sein.

Und ich kann mit ,jedem ein Zwischen setzenprint ','.join(mylist)

Und ich kann in eine Datei ausgeben, dh

myfile = open(...)
print >>myfile, ','.join(mylist)

Aber ich möchte in eine CSV ausgeben und Trennzeichen um die Werte in der Liste haben, z

"value 1", "value 2", ... 

Ich kann keine einfache Möglichkeit finden, die Trennzeichen in die Formatierung einzubeziehen, z. B. habe ich die joinAnweisung durchgearbeitet. Wie kann ich das machen?


Vielen Dank an alle, ich habe die Ideen aus ein paar Antworten kombiniert, um meine Frage zu lösen :) Ich verwende jetzt das CSV-Modul, um die [...] Daten direkt in eine Datei zu schreiben. Import csv data = [...] myfile = open ( ..., 'wb') out = csv.writer (open ("myfile.csv", "w"), delimiter = ',', quoting = csv.QUOTE_ALL) out.writerow (data) funktioniert gut, ich konstruiere Meine Daten [] durch Abrufen einiger Daten aus einer Tabelle mit xlrd und das CSV-Modul schreibt sie in eine Datei mit den richtigen Trennzeichen. Alles gut :) ty all again
Fortilan

Ein neuerer Ansatz könnte sein, Pandas
Richard

Python 3.4 Benutzer, dies funktionierte am besten für mich: stackoverflow.com/questions/25022677/…
Leigh

Antworten:


249
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 wbdurch w( siehe diese SO-Antwort ).

with open(..., 'w', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)

11
Beachten Sie, dass das csvModul in 2.x nicht ordnungsgemäß mit Unicodes umgeht. Beispiele zum Umgang damit finden Sie in der Moduldokumentation. docs.python.org/library/csv.html
Ignacio Vazquez-Abrams

14
Sie können auch wr.writerows (Liste) verwenden
tovmeod

Was ist der Unterschied zwischen Writerow und Writerows?
tumultous_rooster

4
Writerows scheint jedes Element in der Liste in Spalten aufzuteilen, wenn jedes Element auch eine Liste ist. Dies ist sehr praktisch für die Ausgabe von Tabellen.
Whatnick

5
Das funktioniert nicht mit Python 3.4. Ich bekomme TypeError: 'str' does not support the buffer interface.
Botchniaque

104

Hier ist eine sichere Version von Alex Martelli:

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

3
plus 1 für die Verwendung with, um sicherzustellen, dass die Datei geschlossen ist, wenn fertig
BoltzmannBrain

Wenn ich dies in einer for-Schleife verwende, sollte der gesamte with-Block unter der for-Schleife verschachtelt sein? Oder wäre es effizienter, nur wr.writerow(my_list)innerhalb der Schleife zu haben?
Crypdick

1
@crypdick du solltest definitiv nicht den gesamten Block in die Schleife setzen. Öffnen Sie die Datei und schreiben Sie jede Zeile in eine Schleife. Es ist nicht erforderlich, die Datei n-mal zu öffnen, um n Zeilen zu schreiben.
Greg Kaleka

Wenn Sie Zeichenfolgenobjekte in eine Datei schreiben, empfehlen wir die Verwendung von 'wt' beim Öffnen der Datei, um TypeError zu vermeiden: Es ist ein byteähnliches Objekt erforderlich, nicht 'str'.
don_Gunner94

39

Für einen anderen Ansatz können Sie DataFrame in Pandas verwenden : Und es kann die Daten einfach wie im folgenden Code auf csv sichern :

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)

1
Vielen Dank für dieses Code-Snippet, das möglicherweise sofortige Hilfe bietet. Eine richtige Erklärung würde den Bildungswert erheblich verbessern , indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und sie für zukünftige Leser mit ähnlichen, aber nicht identischen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, und geben Sie an, welche Einschränkungen und Annahmen gelten.
Toby Speight

5
Damit dies funktioniert, müssen die Listen dieselbe Länge haben, andernfalls erhalten Sie einen ValueError (pandas v 0.22.0)
cheevahagadog

32

Die beste Option, die ich gefunden habe, war die Verwendung von savetxt des numpyModuls :

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)

8
Dies ist gut für numerische Arbeiten, funktioniert jedoch nicht, wenn Zeichenfolgen in der Liste enthalten sind.
Ricardo Cruz

12

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 das Zitieren gibt.

Hier ist zum Beispiel das 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"

4
Produziert eine leere Datei für mich
caspii

Der erste Lauf ist leer und Sie können ihn dann auch nicht löschen, da er dann in Python geöffnet wird. Zweiter Lauf (oder genauer: out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL))Füllt die Daten, unabhängig davon, ob Sie open("myfile.csv","w")eine neue Datei oder eine neue Datei open("myfile2.csv","w")einfügen. Es scheint, als ob das out-Objekt das auf dem Lauf erstellte Dateiobjekt nicht verarbeiten kann, sondern den Ausgabeprozess als Aufgabe speichert. Mit anderen Worten: Das out-Objekt speichert das Dateiobjekt im ersten Durchlauf, schreibt jedoch nur, wenn das Dateiobjekt bereits vorhanden ist! Siehe die richtige Lösung unten @Saurabh Adhikary
Lorenz

7

In diesem Fall können Sie die Methode string.join verwenden.

Aus Gründen der Übersichtlichkeit auf einige 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 haben Sie jedoch ein Problem, da Ihre Zeichenfolgen in Anführungszeichen eingebettet sind. Wenn dies der Fall ist, müssen Sie entscheiden, wie Sie ihnen entkommen können.

Das CSV-Modul kann all dies für Sie erledigen, sodass Sie zwischen verschiedenen Anführungszeichenoptionen (alle Felder, nur Felder mit Anführungszeichen und Trennzeichen, nur nicht numerische Felder usw.) und der Steuerung von Steuerzeichen (doppelte Anführungszeichen oder) wählen können entkommene Zeichenfolgen). Wenn Ihre Werte einfach sind, ist string.join wahrscheinlich in Ordnung. Wenn Sie jedoch viele Randfälle verwalten müssen, verwenden Sie das verfügbare Modul.


3

Diese Lösung klingt verrückt, funktioniert aber reibungslos wie Honig

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
    wr.writerow(mylist)

Die Datei wird von csvwriter geschrieben, daher werden die csv-Eigenschaften beibehalten, dh durch Kommas getrennt. Das Trennzeichen hilft im Hauptteil, indem Listenelemente jedes Mal in die nächste Zeile verschoben werden.


1
So klein und so schnell
Ian Samz

1
funktioniert, und wenn Sie eine verschachtelte Liste haben, die das Beispiel von @ vy32 erweitert, haben Sie:data = [["value %d" % i, "value %d" % (i+1)] for i in range(1,4)] with open("myfile.txt","w") as f: out = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter='\n') out.writerow([';'.join(x) for x in data])
Lorenz

klingt es wirklich verrückt Ich denke, es klingt vollkommen in Ordnung
Stephanie Owen

3

Erstellen und Schreiben in eine CSV-Datei

Das folgende Beispiel zeigt das Erstellen und Schreiben einer CSV-Datei. Um einen dynamischen Dateischreiber zu erstellen, müssen wir eine Paketimport- CSV importieren und dann eine Instanz der Datei mit dem Dateiverweis erstellen. Beispiel: - mit open ("D: \ sample.csv", "w", newline = "" ) als file_writer

Wenn die Datei mit dem genannten Dateiverzeichnis nicht vorhanden ist, erstellt Python dieselbe Datei im angegebenen Verzeichnis. "w" steht für "Schreiben". Wenn Sie eine Datei lesen möchten, ersetzen Sie "w" durch "r" oder fügen Sie sie hinzu zu vorhandener Datei dann "a". newline = "" gibt an, dass bei jedem Erstellen einer Zeile eine zusätzliche leere Zeile entfernt wird. Um leere Zeilen zu entfernen, verwenden wir newline = "". Erstellen Sie einige Feldnamen (Spaltennamen) mit list like fields = ["Names", "Age "," Class "] , dann auf Writer-Instanz wie writer = csv.DictWriter (file_writer, fieldnames = fields) anwenden, hier Dictionary-Writer verwenden und Spaltennamen zuweisen, um Spaltennamen in csv zu schreiben, verwenden wir writer. Während das Schreiben von Dateiwerten mithilfe der Wörterbuchmethode übergeben werden muss, ist hier der Schlüssel der Spaltenname und der Wert Ihr jeweiliger Schlüsselwert

import csv 

with open("D:\\sample.csv","w",newline="") as file_writer:

   fields=["Names","Age","Class"]

   writer=csv.DictWriter(file_writer,fieldnames=fields)

   writer.writeheader()

   writer.writerow({"Names":"John","Age":21,"Class":"12A"})

2

Jupyter Notizbuch

Nehmen wir an, Ihre Liste ist A

Dann können Sie die folgende Anzeige codieren, die Sie als CSV-Datei haben (nur Spalten!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()

1

Sie sollten das CSV-Modul auf jeden Fall verwenden, aber es besteht die Möglichkeit, dass Sie Unicode schreiben müssen. Für diejenigen, die Unicode schreiben müssen, ist dies die Klasse von 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)

1

Hier ist eine andere Lösung, für die das csvModul nicht erforderlich ist .

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 anfängliche Liste jedoch einige enthält, werden sie nicht maskiert. Wenn dies erforderlich ist, können Sie eine Funktion aufrufen, um sie wie folgt zu maskieren:

print ', '.join(['"'+myFunction(i)+'"' for i in myList])
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.