在视图中,我使用简单的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
Run Code Online (Sandbox Code Playgroud)
在单元测试中,我想测试这个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)
Run Code Online (Sandbox Code Playgroud)
但是测试失败了以下内容headers = next(reader):
nose.proxy.Error: iterator should return strings, not int (did you open the file in text mode?)
Run Code Online (Sandbox Code Playgroud)
我在HttpResponse源中看到response.content将字符串作为字节字符串吐出,但我不确定正确的方法来处理它以csv.reader正确读取文件.我以为我可以替换response.content为response(因为你写入对象本身,而不是它的内容),但这只会导致错误的轻微变化:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
Run Code Online (Sandbox Code Playgroud)
这似乎更接近但显然仍然是错误的.阅读csv文档,我假设我无法正确打开文件.如何"打开"这个类似文件的对象以便csv.reader解析它?
response.content提供字节.您需要将其解码为字符串:
foo = response.content.decode('utf-8')
Run Code Online (Sandbox Code Playgroud)
然后使用io.StringIO将此字符串传递给csv阅读器:
import io
reader = csv.reader(io.StringIO(foo))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1973 次 |
| 最近记录: |