【发布时间】:2016-10-26 11:20:30
【问题描述】:
在一个视图中,我使用简单的 csv 编写器创建了一个完全由 csv 组成的 Django HttpResponse 对象:
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="foobar.csv"'
writer = csv.writer(response)
table_headers = ['Foo', 'Bar']
writer.writerow(table_headers)
bunch_of_rows = [['foo', 'bar'], ['foo2', 'bar2']]
for row in bunch_of_rows:
writer.writerow(row)
return response
在单元测试中,我想测试这个 csv 的某些方面,所以我需要阅读它。我正在尝试这样做:
response = views.myview(args)
reader = csv.reader(response.content)
headers = next(reader)
row_count = 1 + sum(1 for row in reader)
self.assertEqual(row_count, 3) # header + 1 row for each attempt
self.assertIn('Foo', headers)
但测试失败,headers = next(reader) 行显示以下内容:
nose.proxy.Error: iterator should return strings, not int (did you open the file in text mode?)
我在 HttpResponse 源中看到 response.content 将字符串作为字节字符串吐出,但我不确定正确的处理方法是让 csv.reader 正确读取文件。我以为我可以将response.content 替换为response(因为您写入对象本身,而不是其内容),但这只会导致错误略有变化:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
这似乎更接近,但显然仍然是错误的。阅读csv 文档,我认为我无法正确打开文件。如何“打开”这个类文件对象以便csv.reader 可以解析它?
【问题讨论】: