csv コンテンツをテンプレートに渡します。そして、エラーが発生します。ありがとう
def ....
with open('csv', 'rb') as f:
reader = csv.reader(f)
return render(request, template, {"results": reader})
エラー
I/O operation on closed file
csv コンテンツをテンプレートに渡します。そして、エラーが発生します。ありがとう
def ....
with open('csv', 'rb') as f:
reader = csv.reader(f)
return render(request, template, {"results": reader})
エラー
I/O operation on closed file
with
ファイルの場合、終了後にその引数を閉じる処理を行う、新しいコンテキスト マネージャーが導入されました。ただし、コンテキストマネージャーは次の行で終了するため、render
関数が呼び出されるまでにファイルが閉じられ、csv リーダーが操作できなくなります。
おそらく、return
1 つのインデントを右に移動するか、render 内でより適切に呼び出すwith
ことができますが、後で渡す変数に保存できますreturn
。
with open('csv', 'rb') as f:
reader = csv.reader(f)
html = render(request, template, {"results": reader})
return html
問題は、読者オブジェクトをテンプレート (繰り返し処理する場所) に渡していることですが、with
ブロックの外にあるため、ファイルが閉じられています。
この状況を改善する 1 つの方法は、ジェネレーターを反復可能なシーケンスに変換することです。
例えば:
def foo(request):
lines = []
with open('foo.csv', 'rb') as f:
lines = [line for line in csv.reader(f)]
return render(request, template, {'results': lines})