如何返回DictReader的开头?

时间:2016-05-16 15:38:35

标签: python

如果我两次调用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)

2 个答案:

答案 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)