2016-05-16 34 views
0

company_at_nodeメソッド(以下を参照)を2回呼び出すと、最初の呼び出しの行だけが印刷されます。私はおそらくseekを次の呼び出しのために読者の先頭に戻す必要があると考えたので、 self.companies.seek(0)company_at_nodeメソッドの最後に追加しましたが、DictReaderには属性検索がありません。ファイルは決してクローズされないので(これはエラーメッセージが表示されないため)、これはValueError i/o operation on closed fileとは思われませんでした(これは数多くの質問があります)DictReaderの先頭に戻るには?

DictReaderの先頭に戻り、2回目の繰り返しを繰り返します(つまり、2番目の関数呼び出し)。

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

DictReaderの代わりにf.seek(0)を実行する必要があります。次に、ファイルにアクセスできるようにコードを変更することができます。これは動作するはずです:reader = csv.DictReader(f)

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がイテレータです。イテレータは、それぞれの明示的/暗黙的な呼び出しのデータ単位を__next__に出力します。このプロセスはと呼ばれ、イテレータはで、これは一度だけ発生する可能性があります。これはイテレータ構造が究極のメモリ効率を提供する方法です。あなたは、ランダムなインデックスのようなそれから列を作りたい

rows = list(reader) 
+0

私は助けになることをあなたに投票しました(誰かがあなたを投票した)。私はあなたのソリューションか他の1つ(ファイルを求める呼び出し)がより効率的かどうかが不思議です – Leahcim

+0

@Leahcim upvoteに感謝します。コードを作業用スニペットを最適化するのではなく動作させることに関係する疑問である。私は働く解決策を与えました。私の解決策がうまくいかず、効率的な理由でダウンボウティングするなら、私の意見では、あなたの相手は素朴で馬鹿だと推測しています。それが誰であれ、私は決闘のためにその人に挑戦する:) –

関連する問題