如果我两次调用company_at_node
方法(如下所示),它只会为第一次调用打印一行。我想也许我需要seek
回到读者的开头接下来的电话,所以我补充道
self.companies.seek(0)
到company_at_node
方法的末尾,但DictReader没有属性搜索。由于文件永远不会关闭(因为我没有得到相应的错误信息),我认为这不是ValueError i/o operation on closed file
(关于SO的问题很多)
有没有办法返回到DictReader的开头再次迭代(即第二次函数调用)?
class CSVReader:
def __init__(self):
f = open('myfile.csv')
self.companies = csv.DictReader(f)
def company_at_node(self, node):
for row in self.companies:
if row['nodeid'] == node:
print row
self.companies.seek(0)
答案 0 :(得分:3)
你需要做f.seek(0)而不是DictReader。然后,您可以修改代码以便能够访问文件。这应该有效:
class CSVReader:
def __init__(self):
self.f = open('myfile.csv')
self.companies = csv.DictReader(f)
def company_at_node(self, node):
for row in self.companies:
if row['nodeid'] == node:
print row
self.f.seek(0)
答案 1 :(得分:1)
在reader = csv.DictReader(f)
中,实例reader
是一个迭代器。迭代器在其上的__next__
的每个显式/隐式调用上发出一个数据单元。现在该进程被称为使用迭代器,它只能发生一次。这就是迭代器结构提供最终内存效率的方式。因此,如果你想要随机索引,就可以制作一个序列,如
rows = list(reader)