2016-05-16 47 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感謝您的支持。因爲有關使代碼工作而不是優化工作片段的問題。我給出了一個可行的解決方案。考慮到我的要求,我應該低估*如果我的解決方案不起作用*並且出於效率原因下調,在我看來,假定你的對手天真或愚蠢。無論誰是我挑戰那個人的決鬥:) –

相關問題