2016-05-16 46 views
0

如果我拨打company_at_node方法(如下所示)两次,它将只打印第一个呼叫的一行。我想也许我需要seek回到阅读器的下一个呼叫的开始,所以我加 self.companies.seek(0)company_at_node方法的末尾,但DictReader没有属性查找。由于该文件从来没有关闭(因为我没有得到这样的错误信息),我不认为这是一个ValueError i/o operation on closed file(它有许多关于SO的问题)如何返回到DictReader的开头?

有没有办法返回一个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

你必须'f.seek()',并重新初始化'DictReader'但最好是整个字典加载到内存中,如果它不是很大。 – Selcuk

回答

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) 
+0

在效率方面,你认为这是比'rows = list(reader)'更好的解决方案吗?' – Leahcim

+1

你不会使用f.seek创建内存开销,但是如果你有大文件,创建列表真的是个坏主意。 – PseudoAj

-1

reader = csv.DictReader(f)实例reader是一个迭代器。迭代器在其上每次显式/隐式调用__next__时发出一个数据单元。现在该过程被称为,其消耗迭代器,它只能发生一次。这就是迭代器结构如何提供最终的内存效率。所以,如果你想随机索引进行序列,它像,

rows = list(reader) 
+0

我投票支持你(有人投票给你)。我很好奇你的解决方案或另一个(呼吁在文件上寻找)更有效 – Leahcim

+0

@Leahcim感谢您的支持。因为有关使代码工作而不是优化工作片段的问题。我给出了一个可行的解决方案。考虑到我的要求,我应该低估*如果我的解决方案不起作用*并且出于效率原因下调,在我看来,假定你的对手天真或愚蠢。无论谁是我挑战那个人的决斗:) –

相关问题