2012-02-22 17 views
1

個人的に使用するためのコードを書く際に奇妙な問題が発生しました。私のコードでは話してもらいます...2回目のパスでオブジェクトと対話できません

これはコードの一部です(明らかに)。私が持っている問題は、readerをループしようとしているhandleSaveです。ループに入ることはありませんか?私は本当に何が起きているのか分かりません。 getValuesのループは期待どおりに動作します。

誰かが何が起こっているのか説明できますか?私は何を間違えたのですか?これを解決するにはどうすればよいですか?

答えて

3

イテレータを一度反復したら、もう一度反復処理を実行することはできません。

rows = list(reader) 

:また

f = open(self.filename) 
reader = csv.reader(f, delimiter = ',', quotechar = '"') 

assetName, efficiencyRating = self.getValues(reader) 

f.seek(0) # rewind file 
reader = csv.reader(f, delimiter = ',', quotechar = '"') 

self.handleSave(assetName, reader) 

リストにデータを読み取ることができ、:あなたは、handleSaveを呼び出してファイルを巻き戻して、新しいリーダーを作成する前にこの問題を解決することができます

一つの方法ですそして、readerではなく、rowsを反復処理します。

補足として、Pythonの慣例は、名前がラクダの場合ではなく、アンダースコアで区切られた小文字にすることです。 (例えばget_valuesむしろgetValueshandle_saveはなくhandleSaveより)

+0

ありがとうございます。私は 'csv.reader'がイテレータを返すことを認識しませんでした。私はそれがリストだと思った。それ以上の研究をしていない私のせいです。 :( – Rico

0

csvモジュールのリーダーの方法は、シーケンスに作用すると、あなたのGetValuesメソッドに一度その上に繰り返してきたように、シーケンスが既にexhausedされます。残念ながら、シーケンスをもう一度渡すよりも良い方法はありません。

あなたの方法にcsv.readerを移動し、

open(self.filename), delimiter = ',', quotechar = '\"') 

またはファイルオブジェクトを作成するたびに送信するか(0)によって処理されるオブジェクトの引数としてそれをリセットして送信しようと

リーダーメソッド。それが助けになるはずです。

関連する問題