Python возвращает KeyError в csv.DictReader ()

Я новичок в программировании на python (2.x), и даже часами искал, что не смог решить проблему. Python возвращает KeyError

Файл (объект) .csv:

id,name,type
1,low,player

Код на Python:

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 возвращает:

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

Странно то, что как в csv, так и в коде Python заголовок столбца не содержит ошибок ввода. Когда я меняю имя столбца «id», ошибка возвращается к новому заголовку (ранее «id»). (То же самое происходит, когда я добавляю еще один заголовок и пытаюсь его прочитать)

Любая помощь приветствуется и приносит извинения за неудобства. благодарный


person Leandro Peres    schedule 20.02.2017    source источник
comment
У вас есть лишний пробел вокруг запятых, поэтому настоящие имена столбцов - 'id ', ' name ' & ' type'. Попробуйте напечатать строку перед вызовом create_item, чтобы увидеть это на практике.   -  person niemmi    schedule 20.02.2017
comment
Лишние пробелы были моей ошибкой при вводе сообщения. Прости за это. Когда я печатаю строку, результат будет: '{' id ':' 1 ',' name ':' low ',' type ':' player '}', но после этого ошибка сохраняется.   -  person Leandro Peres    schedule 20.02.2017
comment
Перехватить исключение и в пакете except print row - ключи, чего вы ожидали?   -  person wwii    schedule 20.02.2017


Ответы (1)


 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)

выход:

things = populate()
things.keys()
dict_keys(['1'])
person gregory    schedule 20.02.2017
comment
этот вывод возвращает мне: Файл items.py, строка 33, в заполнении f = open ('files / object.csv', 'rb') RuntimeError: максимальная глубина рекурсии превышена при вызове объекта Python Я понятия не имею, что это такое - person Leandro Peres; 21.02.2017
comment
то же самое происходит с f = open ('files / object.txt', 'r') [то же самое, когда я меняю all_items [new_item.label] на all_items [new_item.id]] - person Leandro Peres; 21.02.2017
comment
@LeandroPeres, 1. это другая ошибка, значит ваша проблема решена. 2. Новая проблема, с которой вы сталкиваетесь, уже обсуждается здесь: stackoverflow.com/questions/14222416/ - person gregory; 21.02.2017