Ich versuche, ein Wörterbuch aus einer CSV-Datei zu erstellen. Die erste Spalte der CSV-Datei enthält eindeutige Schlüssel und die zweite Spalte enthält Werte. Jede Zeile der CSV-Datei repräsentiert ein eindeutiges Schlüssel-Wert-Paar im Wörterbuch. Ich habe versucht, die Klassen csv.DictReader
und zu csv.DictWriter
verwenden, konnte aber nur herausfinden, wie für jede Zeile ein neues Wörterbuch erstellt werden kann. Ich möchte ein Wörterbuch. Hier ist der Code, den ich verwenden möchte:
import csv
with open('coors.csv', mode='r') as infile:
reader = csv.reader(infile)
with open('coors_new.csv', mode='w') as outfile:
writer = csv.writer(outfile)
for rows in reader:
k = rows[0]
v = rows[1]
mydict = {k:v for k, v in rows}
print(mydict)
Wenn ich den obigen Code ausführe, erhalte ich eine ValueError: too many values to unpack (expected 2)
. Wie erstelle ich ein Wörterbuch aus einer CSV-Datei? Vielen Dank.
python
csv
dictionary
list-comprehension
drbunsen
quelle
quelle
Antworten:
Ich glaube, die Syntax, nach der Sie gesucht haben, lautet wie folgt:
Alternativ möchten Sie für Python <= 2.7.1:
quelle
Öffnen Sie die Datei, indem Sie open und dann aufrufen
csv.DictReader
.Sie können die Zeilen des CSV-Dict-Reader-Objekts durchlaufen, indem Sie die Eingabedatei durchlaufen.
ODER Nur auf die erste Zeile zugreifen
UPDATE In Python 3+ -Versionen würde sich dieser Code ein wenig ändern:
quelle
next(dictobj)
stattdictobj.next()
in Python 3+ Versionen.quelle
for row in reader: k, v = row
wenn Sie beispielsweise einfach schreibenfor k, v in reader
können. Und wenn Sie erwarten, dass dieser Reader iterierbar ist und Elemente mit zwei Elementen erzeugt, können Sie ihn einfach direkt an das Diktat zur Konvertierung übergeben.d = dict(reader)
ist bei großen Datenmengen viel kürzer und deutlich schneller.for row in reader
Paradigma zu berücksichtigen, ist es möglicherweise (nach längerfristiger Entwicklung) praktischer. Ich stimme Ihnen kurzfristig zu, aber hüte dich vor vorzeitiger Optimierung.Dies ist keine elegante, sondern eine einzeilige Lösung mit Pandas.
Wenn Sie dtype für Ihren Index angeben möchten (dieser kann in read_csv nicht angegeben werden, wenn Sie das Argument index_col aufgrund eines Fehlers verwenden ):
quelle
Sie müssen nur csv.reader konvertieren, um zu diktieren:
quelle
ValueError: dictionary update sequence element #2 has length 3; 2 is required
.filter
Anruf mitmap(operator.itemgetter(slice(2)), ...)
umbrochen wird, sodass nur die ersten beiden Punkte abgerufen werdendict(map(operator.itemgetter(slice(2)), filter(None, csv.reader(f))))
. Wenn es sich um Python 2 handelt, stellen Sie sicherfrom future_builtins import map, filter
, dass dies derdict
Fall ist , damit der Generator direkt gelesen wird, anstatt zuerst mehrere unnötige temporärelist
s zu erzeugen .Sie können hierfür auch numpy verwenden.
quelle
Ich würde vorschlagen, hinzuzufügen,
if rows
falls am Ende der Datei eine leere Zeile stehtquelle
Einzeilige Lösung
quelle
Wenn Sie mit der Verwendung des numpy-Pakets einverstanden sind, können Sie Folgendes tun:
quelle
Für einfache CSV-Dateien wie die folgenden
Sie können es nur mit integrierten Funktionen in ein Python-Wörterbuch konvertieren
Dies sollte das folgende Wörterbuch ergeben
Hinweis: Python-Wörterbücher haben eindeutige Schlüssel. Wenn Ihre CSV-Datei also doppelt vorhanden ist
ids
, sollten Sie jede Zeile an eine Liste anhängen.quelle
set_default
: csv_dict.set_default (key, []). append ({key: Wert für Schlüssel, Wert in zip (Header, Werte)}).append
Befehl war sehr nützlich.row.update
Beim Iterieren und Hinzufügen zu einemDictReader
Objekt, das aus einer CSV-Datei erstellt wurde, habe ich dieselbe Syntax verwendet.Sie können dies verwenden, es ist ziemlich cool:
quelle
Es wurden viele Lösungen veröffentlicht, und ich möchte mit meinen einen Beitrag leisten, der für eine andere Anzahl von Spalten in der CSV-Datei funktioniert. Es wird ein Wörterbuch mit einem Schlüssel pro Spalte erstellt, und der Wert für jeden Schlüssel ist eine Liste mit den Elementen in dieser Spalte.
quelle
Mit Pandas ist es zum Beispiel viel einfacher. Angenommen, Sie haben die folgenden Daten als CSV und nennen wir sie
test.txt
/test.csv
(Sie wissen, dass CSV eine Art Textdatei ist).jetzt mit Pandas
für jede Reihe wäre es
und das ist es.
quelle
Versuchen Sie, ein
defaultdict
und zu verwendenDictReader
.Es gibt zurück:
quelle