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 阅读器无法操作。

您可能只是将return一个缩进向右移动,或者更好地在其中调用 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块中,因此文件已关闭。

为了纠正这种情况,一种方法是将生成器转换为一些可迭代的序列。

例如:

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 回答