0

csv コンテンツをテンプレートに渡します。そして、エラーが発生します。ありがとう

  def ....
    with open('csv', 'rb') as f:
      reader = csv.reader(f)
    return render(request, template, {"results": reader})

エラー

I/O operation on closed file

完全なトレースバック

4

2 に答える 2

3

withファイルの場合、終了後にその引数を閉じる処理を行う、新しいコンテキスト マネージャーが導入されました。ただし、コンテキストマネージャーは次の行で終了するため、render関数が呼び出されるまでにファイルが閉じられ、csv リーダーが操作できなくなります。

おそらく、return1 つのインデントを右に移動するか、render 内でより適切に呼び出すwithことができますが、後で渡す変数に保存できますreturn

with open('csv', 'rb') as f:
    reader = csv.reader(f)
    html = render(request, template, {"results": reader})
return html
于 2012-05-28T20:27:03.980 に答える
0

問題は、読者オブジェクトをテンプレート (繰り返し処理する場所) に渡していることですが、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})
于 2012-05-28T20:30:13.893 に答える