私はcsvファイルからデータを抽出する2つの関数を持っています。リストを返し、もう1つはジェネレータを返します。ValueError:** generator **を使用した場合の閉じたファイルの入出力操作**
一覧:
def data_extraction(filename,start_line,node_num,span_start,span_end):
with open(filename, "r") as myfile:
file_= csv.reader(myfile, delimiter=',') #extracts data from .txt as lines
return [filter(lambda a: a != '', row[span_start:span_end]) \
for row in itertools.islice(file_, start_line, node_num+1)]
ジェネレータ:
def data_extraction(filename,start_line,node_num,span_start,span_end):
with open(filename, "r") as myfile:
file_= csv.reader(myfile, delimiter=',') #extracts data from .txt as lines
return (itertools.ifilter(lambda a: a != '', row[span_start:span_end]) \
for row in itertools.islice(file_, start_line, node_num+1))
私はデータを抽出するために、以下のいずれかの関数への呼び出しで私のプログラムを起動します。 次の行は次のとおりです。print [x in data]
私は私が手発電機を使用するとき、それはすべて、正常に動作リストを返す関数を使用する場合:ValueError: I/O operation on closed file
を、私はそれが事実に起因したことを他の質問から収集しましたdata_extraction
ファンクションreturns
の場合、with open
ステートメントが失われている可能性があります。
質問は次のとおりです。私はすべてのコードを1つの関数の中に入れる必要がないように、データを抽出する独立した関数を持つことができる回避策がありますか?そして第二に、ジェネレータを複数回使用するようにリセットすることができますか?
ジェネレータをリストの上に保持したい理由は、大きなデータセットを扱っているからです。
http://stackoverflow.com/questions/519633/lazy-method-for-reading-big-file-in-python –
:あなたは今、このようにそれを使用することができます
2番目の関数はジェネレータではありません.Ganaratorは何かを返すのではなく、 'yield'する必要があります。 –
@ivan_pozdeev 2番目の関数*はジェネレータを返します。 – MisterMiyagi