2017-08-10 10 views
1

Ich versuche, von einer CSV-Datei in ein Wörterbuch zu lesen. Das Problem ist, dass ich 3 Werte pro Zeile (nicht nur 2) habe und in ein Diktat transformieren möchte, wobei der erste Wert der Schlüssel und die letzten 2 Werte zu einem einzigen Wert kombiniert sind (z. B. eine Liste oder ein Tupel). Als Beispiel habe ich folgendes innerhalb csv:Python Fehler beim Versuch, eine CSV-Datei in ein Wörterbuch zu lesen

Calcium Enriched 100% Lactose Free Fat Free Milk,2346,57876.0 

Large Organic Omega3 Brown Eggs,2568,86280.0 

Roasted & Salted Shelled Pistachios,919,29358.0 

Chocolate Peanut Butter Protein Bar,801,21296.0 

...

ich das ausgegeben werden soll, so etwas sein:

{'Calcium Enriched 100% Lactose Free Fat Free Milk': [2346,57876.0]} 

{'Large Organic Omega3 Brown Eggs': [2568,86280.0]} 

{'Roasted & Salted Shelled Pistachios': [919,29358.0]} 

{'Chocolate Peanut Butter Protein Bar': [801,21296.0]} 

Ich versuchte es die normale Art und Weise zu tun wie folgt aus:

with open('avg_prod_reorder_time.csv', 'r', encoding='utf-8') as csv_file: 
    reader = csv.reader(csv_file) 
    avg_prod_reorder_time = dict(reader) 

Aber ich erhalte den folgenden Fehler:

ValueError: dictionary update sequence element #0 has length 3; 2 is required 

Wie behebt man das? Vielen Dank.

Antwort

0

Dies schafft eine dict, wie man wollte:

avg_prod_reorder_time = {r[0]: r[1:] for r in reader if r} 

A dict besteht aus Schlüssel/Wert-Paare, aber Ihre Daten werden in Paaren nicht formatiert. Der obige Code nimmt das erste Element als Schlüssel und bildet eine Liste aller verbleibenden Elemente. Die Bedingung if r überspringt leere Zeilen.

0

Sie brauchen nicht csv. Lesen Sie die Dateien Zeile für Zeile und teilen Sie sie.

with open("data.csv", 'r') as f: 
    for line in f: 
     key, *value = line.rstrip("\n").split(',') 
     result = {key: list(value)} 
0

Betrachten Sie eine CSV-Datei wie diese haben,

some.csv

Hello ,1,2 
There ,2,3 
Friend ,4,5 

du versuchen können,

import csv 
mydict = {} 
with open("some.csv","r+") as c: 
    r = csv.reader(c) 
    for row in r: 
     mydict[row[0]] = row[1:] 
print(mydict) 

Ausgang:

{'Friend ': ['4', '5'], 'Hello ': ['1', '2'], 'There ': ['2', '3']} 

Erläuterungen:

Dies ist der Teil, wo Sie interessiert sein werden,

r = csv.reader(c) 
for row in r: 
    mydict[row[0]] = row[1:] 

Hier sind wir

Zuordnung

mydict[row[0]] mit row[1:]

dh für erste

mydict['Hello'] mit row[1:] d. H. [1,2] # Aufteilen der Liste

Ähnlich für die anderen Zeilen.

Hinweis:

Liste Slicing bedeutet eine Liste basierend auf Indizes Schneiden, dies versuchen, wenn Sie nicht über sich wissen. Die allgemeine Form ist wie diese,

your_list [Start: stop]

Hinweis Beginn ist inklusive Stopp ist exklusiv

>>> a = [1,2,3,4] 
>>> a[0] 
1 
>>> a[1:] 
[2, 3, 4] 
>>> a[2:] 
[3, 4] 
>>> a[3:] 
[4] 
>>> a[:2] 
[1, 2] 
>>> a[:3] 
[1, 2, 3] 
>>> a[:1] 
[1] 
Verwandte Themen