2015-05-04 1 views
0

Я пытаюсь создать класс, который будет принимать CSV-файл, читать его и сортировать в словаре, используя одну из строк в качестве ключа. Все, что я могу найти в Интернете по отношению к файлам csv, касается их вне классов.Сортировка CSV в словаре в классе

Я пытаюсь открыть файл csv (называемый books.csv) и читать каждую строку в частный атрибут класса Shelf под названием __books, который является словарем. Словарь должен использовать ISBN в качестве ключа.

Я хочу, чтобы получить файл CSV books.csv в словарь __books{ } и поставить 4-ю строку в качестве ключа, но каждый раз, когда я бегу, он утверждает, что файл books.csv не читается в словарь.

Первая часть кода:

class Book: 

    def __init__(self, title, author, price, isbn): 
     self.title = title 
     self.author = author 
     self.price = price 
     self.isbn=isbn 

    def getISBN(self): 
     return self.isbn 


class Shelf: 

    __books={} 

    def __init__(self,filename): 
     f=open(filename, encoding="utf8") 
     csvreader = csv.reader(f) 

    for row in csvreader: 
     abook=Book(row[0],row[1],row[2],row[3]) 
     self.__books[row[4]]=abook 

Этот код будет вызываться в другой файл и соответствующий код:

aShelf=Shelf("books.csv") 
    abook=aShelf._Shelf__books["0743482836"] 
    if abook.author == "A. Goose": 
     pass 
    else: 
     raise Exception 
+0

Что вы подразумеваете под импортированием в словарь? Как вы сейчас работаете неправильно? –

+0

Извините, если неясно. фактический вопрос: Откройте файл csv (так называемый «books.csv») и прочитайте каждую строку в частный атрибут класса Shelf под названием __books, который является словарем.Словарь должен использовать ISBN в качестве ключа. Я хочу получить файл csv «books.csv» в словаре __books {} и поставить четвертый буксир в качестве ключа, но каждый раз, когда я его запускаю, он утверждает, что файл «books.csv» не читается в словаре , – Albi

+0

Я думаю, что это связано с отступом блока, начинающимся 'для строки в csvreader'. Если вы измените это на одном уровне, то он станет частью вашего метода '__init__' и должен работать. –

ответ

0

Я считаю, что ваша ошибка в том, что раздел, который вставляет в словарь не имеет отступов правильно и поэтому не запускается, когда ваш метод __init__ называется

До

def __init__(self,filename): 
    f=open(filename, encoding="utf8") 
    csvreader = csv.reader(f) 

for row in csvreader: 
    abook=Book(row[0],row[1],row[2],row[3]) 
    self.__books[row[4]]=abook 

После

def __init__(self,filename): 
    f=open(filename, encoding="utf8") 
    csvreader = csv.reader(f) 

    ''' indented here ''' 
    for row in csvreader: 
     abook=Book(row[0],row[1],row[2],row[3]) 
     self.__books[row[4]]=abook 

Вы также можете устранить некрасивый синтаксис указателя в цикле при распаковке значения как tuple.

ПРИМЕЧАНИЕ. Этот раздел основан на обновленной информации OPs в комментариях, относящейся к тому, какие индексы в данных csv представляют параметры книги. Предыдущие разделы не обновляются.

for _, title, author, price, isbn, *_ in csvreader: 
    self.__books[isbn] = Book(title, author, price, isbn) 

Это должно быть гораздо читабельнее. Единственное, что не понятно, это индекс isbn, но я дам вам понять, что один из них.

1

Есть несколько проблем с кодом. Во-первых, я думаю, что __books следует определить как переменную экземпляра, а не переменную класса. Как вы это делаете, если вы создадите несколько экземпляров Shelf, они поделятся словарем (я не думаю, что это намерение).

Во-вторых, когда вы читаете файлы, вы должны использовать инструкцию with, чтобы не утечка ресурсов. В-третьих, как следует из некоторых замечаний, вы должны передать номер столбца, который вы хотите использовать в качестве ключа в качестве аргумента.

И, наконец, вы можете предоставить __getitem__, чтобы упростить синтаксис при поиске книг.

class Shelf: 
    def __init__(self,filename, key_no=3): 
     self._books={} 
     with open(filename, encoding="utf8") as f: 
      csvreader = csv.reader(f) 
      for row in csvreader: 
       abook = Book(*[x.strip() for x in row]) 
       self._books[row[key_no].strip()] = abook 

    def __getitem__(self, isbn): 
     return self._books[isbn] 


aShelf=Shelf("books.csv") 
print(aShelf._books) 

abook = aShelf["0743482836"] 
if abook.author == "A. Goose": 
    pass 
else: 
    raise Exception 
+0

Я никогда не знал, что это означало переменную класса +1 от меня. –

Смежные вопросы