it-swarm.com.de

Erstellen eines Wörterbuchs aus einer CSV-Datei?

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 stellt ein eindeutiges Schlüssel/Wert-Paar innerhalb des Wörterbuchs dar. Ich habe versucht, die Klassen csv.DictReader und csv.DictWriter zu verwenden, konnte jedoch nur herausfinden, wie für jede Zeile ein neues Wörterbuch erstellt wird. 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 starte, erhalte ich eine ValueError: too many values to unpack (expected 2). Wie erstelle ich ein Wörterbuch aus einer CSV-Datei? Vielen Dank.

94
drbunsen

Ich glaube, die gesuchte Syntax lautet wie folgt:

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)
        mydict = {rows[0]:rows[1] for rows in reader}

Alternativ für Python <= 2.7.1 möchten Sie:

mydict = dict((rows[0],rows[1]) for rows in reader)
115
Nate

Öffnen Sie die Datei, indem Sie open und dann csv.DictReader aufrufen.

input_file = csv.DictReader(open("coors.csv"))

Sie können die Zeilen des csv-Datei-Diktablesobjekts durchlaufen, indem Sie die Eingabedatei durchlaufen. 

for row in input_file:
    print row

ODER Nur um auf die erste Zeile zuzugreifen

dictobj = csv.DictReader(open('coors.csv')).next() 
48
import csv
reader = csv.reader(open('filename.csv', 'r'))
d = {}
for row in reader:
   k, v = row
   d[k] = v
46
robert

Sie müssen nur csv.reader in dict konvertieren:

~ >> cat > 1.csv
key1, value1
key2, value2
key2, value22
key3, value3

~ >> cat > d.py
import csv
with open('1.csv') as f:
    d = dict(filter(None, csv.reader(f)))

print(d)

~ >> python d.py
{'key3': ' value3', 'key2': ' value22', 'key1': ' value1'}
15
Alex Laskin

Sie können dazu auch numpy verwenden.

from numpy import loadtxt
key_value = loadtxt("filename.csv", delimiter=",")
mydict = { k:v for k,v in key_value }
11
Thiru

Dies ist nicht elegant, sondern eine einzeilige Lösung für Pandas.

import pandas as pd
pd.read_csv('coors.csv', header=None, index_col=0, squeeze=True).to_dict()

Wenn Sie dtype für Ihren Index angeben möchten (es kann nicht in read_csv angegeben werden, wenn Sie das Argument index_col aufgrund eines bug verwenden):

import pandas as pd
pd.read_csv('coors.csv', header=None, dtype={0: str}).set_index(0).squeeze().to_dict()
10
mudassirkhan19

Ich würde vorschlagen, if rows hinzuzufügen, falls am Ende der Datei eine leere Zeile steht

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)
        mydict = dict(row[:2] for row in reader if row)
4
John La Rooy

Wenn Sie mit dem Paket numpy einverstanden sind, können Sie Folgendes tun:

import numpy as np

lines = np.genfromtxt("coors.csv", delimiter=",", dtype=None)
my_dict = dict()
for i in range(len(lines)):
   my_dict[lines[i][0]] = lines[i][1]
3
cloudyBlues

Sie können dies verwenden, es ist ziemlich cool:

import dataconverters.commas as commas
filename = 'test.csv'
with open(filename) as f:
      records, metadata = commas.parse(f)
      for row in records:
            print 'this is row in dictionary:'+rowenter code here
1
hamed

Einliner-Lösung

import pandas as pd

dict = {row[0] : row[1] for _, row in pd.read_csv("file.csv").iterrows()}
0
Trideep Rath

Versuchen Sie, defaultdict und DictReader zu verwenden.

import csv
from collections import defaultdict
my_dict = defaultdict(list)

with open('filename.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    for line in csv_reader:
        for key, value in line.items():
            my_dict[key].append(value)

Es gibt zurück:

{'key1':[value_1, value_2, value_3], 'key2': [value_a, value_b, value_c], 'Key3':[value_x, Value_y, Value_z]}
0

Für einfache CSV-Dateien wie die folgenden

id,col1,col2,col3
row1,r1c1,r1c2,r1c3
row2,r2c1,r2c2,r2c3
row3,r3c1,r3c2,r3c3
row4,r4c1,r4c2,r4c3

Sie können es in ein Python Wörterbuch konvertieren, indem Sie nur integrierte Funktionen verwenden

with open(csv_file) as f:
    csv_list = [[val.strip() for val in r.split(",")] for r in f.readlines()]

(_, *header), *data = csv_list
csv_dict = {}
for row in data:
    key, *values = row   
    csv_dict[key] = {key: value for key, value in Zip(header, values)}

Dies sollte das folgende Wörterbuch ergeben

{'row1': {'col1': 'r1c1', 'col2': 'r1c2', 'col3': 'r1c3'},
 'row2': {'col1': 'r2c1', 'col2': 'r2c2', 'col3': 'r2c3'},
 'row3': {'col1': 'r3c1', 'col2': 'r3c2', 'col3': 'r3c3'},
 'row4': {'col1': 'r4c1', 'col2': 'r4c2', 'col3': 'r4c3'}}

Hinweis: Python Wörterbücher haben eindeutige Schlüssel. Wenn Ihre CSV-Datei also doppelt ids enthält, sollten Sie jede Zeile an eine Liste anhängen.

for row in data:
    key, *values = row

    if key not in csv_dict:
            csv_dict[key] = []

    csv_dict[key].append({key: value for key, value in Zip(header, values)})
0
yellow01

Viele Lösungen wurden veröffentlicht, und ich möchte mit meiner beitragen, die 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.

    input_file = csv.DictReader(open(path_to_csv_file))
    csv_dict = {elem: [] for elem in input_file.fieldnames}
    for row in input_file:
        for key in csv_dict.keys():
            csv_dict[key].append(row[key])
0