2015-05-04 47 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消除你的循環醜陋指數語法。

注意:本節基於OP中更新的註釋中的信息,與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。 –