2017-02-20 5 views
0

Ich bin neue Programmierung auf Python (2.x) und sogar auf der Suche nach Stunden konnte ich das Problem nicht lösen. Python gibt eine KeyErrorPython gibt KeyError in csv.DictReader() zurück

Die (Objekt) CSV-Datei ist:

id,name,type 
1,low,player 

Der Python-Code ist:

import csv 

class Item(object): 

    def setup(self, config): 
     self.config = config 
     self.label = config['label'] 
     self.name = config['name'] 
     self.type = config['type'] 
def create_item(config): 
    new_item = Item() 
    new_item.setup(config) 
    return(new_item) 

def populate(): 
    all_items = {} 
    f = open('object.csv', 'rb') 
    reader = csv.DictReader(f, delimiter = ',') 
    for row in reader: 
     new_item = (create_item(row)) 
     all_items[new_item.label] = new_item 
    return(all_items) 

Python zurück:

Self.type = config['type'] 
KeyError: 'type' 

Das Seltsame ist, dass sowohl in csv als auch im Python-Code die Spaltenüberschrift keinen Tippfehler enthält. Wenn ich den Namen der Spalte "id" ändere, kehrt der Fehler zum neuen Header zurück (zuvor "id"). (Das gleiche passiert, wenn ich einen anderen Header hinzufügen und versuche, es zu lesen)

Jede Hilfe ist willkommen und Entschuldigung für die Unannehmlichkeiten. dankbar

+0

Sie haben mehr Platz um die Kommas, so dass die realen Spaltennamen ' 'id '' sind, '' name '' & '' type''. Versuchen Sie, eine Zeile auszudrucken, bevor Sie 'create_item' aufrufen, um sie in der Praxis zu sehen. – niemmi

+0

Die zusätzlichen Leerzeichen waren mein Fehler beim Schreiben der Post. Das tut mir leid. Die Rückgabe beim Drucken der Zeile lautet: '{' id ':' 1 ',' name ':' niedrig ',' type ':' player '}, aber danach bleibt der Fehler bestehen –

+0

[Catch the exception] (https://docs.python.org/3/tutorial/errors.html#handling-exceptions) und in der Ausnahme-Suite print '' 'row''' - sind die Schlüssel das, was Sie erwartet haben? – wwii

Antwort

0
class Item(object): 

     def setup(self, config): 
      self.config = config 
      self.id = config['id'] 
      self.name = config['name'] 
      self.type = config['type'] 

    def create_item(config): 
      new_item = Item() 
      new_item.setup(config) 
      return(new_item) 
    def populate(): 
      all_items = {} 
      f = open('test.txt', 'r') 
      reader = csv.DictReader(f, delimiter = ',') 
      for row in reader: 
       new_item = (create_item(row)) 
       all_items[new_item.id] = new_item 
      return(all_items) 

Ausgang:

things = populate() 
things.keys() 
dict_keys(['1']) 
+0

dieser Ausgang gibt mich zurück: Datei "items.py", Zeile 33, in f = auffüllen fullen ('files/object.csv', 'rb') RuntimeError: maximale Rekursionstiefe beim Aufruf eines Python-Objekts überschritten Ich habe keine Ahnung was Es ist –

+0

das gleiche passiert mit f = offen ('files/object.txt', 'r') [das gleiche, wenn ich die all_items [new_item.label] für all_items [new_item.id] tauschen –

+0

@LeandroPeres, 1. Dies ist ein anderer Fehler, so dass Ihr Problem gelöst ist. 2. Das neue Problem, auf das Sie stoßen, wird bereits hier besprochen: http://stackoverflow.com/questions/14222416/recursion-in-python-runtimeerror-maximum-recursion-depth-exceeded-while-callin – gregory