【发布时间】:2015-05-04 11:31:54
【问题描述】:
我一直在尝试创建一个接受 CSV 文件的类,读取它并使用其中一行作为键将其排序到字典中。我可以在网上找到的与 csv 文件相关的所有内容都在课堂之外处理。
我正在尝试打开 csv 文件(称为 books.csv)并将每一行读入名为 __books 的 Shelf 类的私有属性中,这是一个字典。字典应该使用 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
【问题讨论】:
-
导入字典是什么意思?您现在无法正常工作的原因是什么?
-
很抱歉,如果不清楚。实际问题是:打开 csv 文件(称为“books.csv”)并将每一行读入名为 __books 的 Shelf 类的私有属性,该属性是一个字典。字典应该使用 ISBN 作为键。我想将 csv 文件“books.csv”放入字典 __books{} 中,并将第 4 个拖曳作为键,但每次我运行它时,它都会指出“books.csv”文件没有被读入字典.
-
我认为这是由于从
for row in csvreader开始的块的缩进。如果您将其转移到一个级别,那么它将成为您的__init__方法的一部分并且应该可以工作。 -
另一件不清楚的事情是,您将 isbn 指定为
Book构造函数的第四个参数,并在创建书籍时将 row[3] 作为该值传递。然后使用 row[4] 作为dict键。那么isbn是索引3还是4?如果您将它用作dict的密钥,您可以在适当的情况下从Book类中省略 if 并避免数据冗余。 -
对不起,这是我的错,它在我的代码中缩进了,然后它就不起作用了。我还稍微更改了行,因为它与 csv 文件不正确对应,因此现在用于 csvreader 中的行:abook=Book(row[1],row[2],row[4],row[5]) self. __books[row[5]]=abook 这使得 row[1]=title, row[2]=author, row[4]=price 和 row[5]=isbn 与 csv 文件中的一样。
标签: python class csv dictionary