将csv内容传递给模板。并得到错误。感谢
def ....
with open('csv', 'rb') as f:
reader = csv.reader(f)
return render(request, template, {"results": reader})
错误
I/O operation on closed file
答案 0 :(得分:3)
with
引入了一个新的上下文管理器,在文件的情况下,它会在结束后关闭它的参数。但是,您的上下文管理器在下一行结束,因此在调用render
函数时,文件将关闭,并且csv阅读器无法运行。
您可以将return
一个缩进向右移动,或者在with
内更好地调用渲染,但将其保存到随后传递给return
的变量中:
with open('csv', 'rb') as f:
reader = csv.reader(f)
html = render(request, template, {"results": reader})
return html
答案 1 :(得分: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})