2016-07-19 17 views
0

Für die folgende CSV-Datei:Erstellen Wörterbuch aus CSV-Datei,

A,B,C 

A1,B1,C1 
A1,B2,C2 
A2,B3,C3 
A2,B4,C4 

Wie erhalte ich mein Wörterbuch wie folgt aussehen:

{'A1': {'B1': 'C1', 'B2' : 'C2'}, 'A2': {'B3': 'C3', 'B4' : 'C4'}} 

Ich bin mit dem folgenden Code: -

EgDict = {} 
with open('foo.csv') as f: 
    reader = csv.DictReader(f) 
    for row in reader: 
     key = row.pop('A') 
     if '-' in key: 
       continue 
     if key not in result: 
       new_row = {row.pop('B'): row.pop('C')} 
       result[key] = new_row 
     else: 
       result[key][row.pop('B')].append(row.pop('C')) 

ich erhalte den folgenden Fehler: -

AttributeError: 'dict' object has no attribute 'append' 

Was mache ich hier falsch?

Antwort

2

Ein Wörterbuch hat keine append Methode. Das wird für Listen sein.

Sie können prüfen, stattdessen den folgenden Code:

d = {} 
with open('foo.csv') as f: 
    reader = csv.DictReader(f) 
    for row in reader: 
     d.setdefault(row['A'], {}).update({row['B']: row['C']}) 
print(d) 
# {'A1': {'B1': 'C1', 'B2' : 'C2'}, 'A2': {'B3': 'C3', 'B4' : 'C4'}} 

setdefault setzt einen neuen Schlüssel mit einem Standard {} Wert, wenn man nicht existiert und die Aktualisierungsmethoden aktualisiert das Wörterbuch zu diesem Schlüssel die neuen Werte verwenden.

+0

kurz und süß. Danke Kumpel :) – kage77

+0

gibt es eine Möglichkeit, Teil 'C' ohne die Anführungszeichen ('') zu speichern. Der Grund, warum ich das frage ist, weil C in meinem Code eine Zahl ist, und meine Berechnungen lesen es als String wegen der ''. Ist das sinnvoll? – kage77

+0

Das sind Strings, wenn Sie versuchen, das schließende '''' zu entfernen, erhalten Sie einen Namensfehler –

0
res = {} 
with open('foo.csv') as f: 
    reader = csv.reader(f) 
    for i,item in enumerate(reader): 
     if i == 0: continue 
     a,b = item[0],item[1:] 
     if a not in res: 
      res[a] = {} 
     res[a].update({b[0]:b[1]}) 
+0

Anstatt nur Code, wäre es gut, auch eine kurze Erklärung zu haben, was Sie geändert haben und warum es das Problem löst. – JJJ

+0

Während Code-Only-Antworten nicht verboten sind, bitte verstehen Sie, dass dies eine Q & A-Community ist, anstatt eine Crowd-Sourcing, und dass, wenn der OP den Code als Antwort bekannt gegeben hätte, er/sie gekommen wäre mit einer ähnlichen Lösung für sich selbst, und hätte überhaupt keine Frage gestellt. Bitte geben Sie * context * als Antwort auf Ihre Antwort und/oder Ihren Code an, indem Sie erklären * wie * und/oder * warum * es funktioniert. – XenoRo

Verwandte Themen