2016-12-05 6 views
1

私は、CSVリーダーを使用して、いくつかのCSV処理を行うようにしようとしていたと私はCSVリーダーで読み取る行を反復しなければならない問題に貼り付けました。しかし、2回目の反復では、すべての行が既に反復されているのでnilを返します。反復子をリフレッシュして最初から開始する方法はありますか。csv.readerをリセットします()反復子

コード:

は正確

ID、価格、名前 X、Y、Z 、B、 C以下の形式のCSVファイルを読み込むさはどのように過ごしたいれる

desc=open("example.csv","r") 

Reader1=csv.read(desc) 

for lines in Reader1: 
(Some code) 

for lines in Reader1: 
(some code) 

パンダライブラリに

+1

あなたが複数回、それを反復処理する必要がある場合は、リストにそれを消費する - 'all_lines =リスト(Reader1)':teeアプローチ、ラインの後にあなたはReader1に作成します。 – jonrsharpe

+0

余分なスペースはかかりませんか? Reader1にはすでにすべての行があるためです。 –

+0

@PoojaGupta 'desc.seek(0)'を実行し、ファイル記述子の浪費を避け、メモリ内にCSVを保持しないように、新しいイテレータを作成することができます。 –

答えて

3

リセットを使用せずにZC :XA 価格::YB 名と ID以下の形式で並べ替えます

desc.seek(0) 
# Apparently, csv.reader will not refresh if the file is seeked to 0, 
# so recreate it 
Reader1 = csv.reader(desc) 

マインドメモリが懸念されていない場合、一般的に2回listを繰り返す、listへの入力を読み取るために速く、次のようになります。第二のループの前に、次を追加しseekで基本となるファイルオブジェクト、 。また、あなたがuse itertools.tee最初のイテレータから2回の反復子を作ることができた(あなたが完全に他を開始する前に1つのイテレータを繰り返す場合にはlistにズルズルと同様のメモリを必要としますが、すぐに反復処理を開始することができ、代わりになるためにファイル全体を待っているのあなたがそれを処理する前に読んでください)。いずれのアプローチでも、ファイルを2度反復する追加のシステムコールは発生しません。 、

# It's not safe to reuse the argument to tee, so we replace it with one of 
# the results of tee 
Reader1, Reader2 = itertools.tee(Reader1) 

for line in Reader1: 
    ... 

for line in Reader2: 
    ... 
+0

これはイテレータを自動的にリセットするようには見えません。 –

+1

@musically_ut:ああ。愚かな実装の詳細。しかし、それを再現するのは簡単です。編集されました。 – ShadowRanger