gpt4 book ai didi

python - 如何读取 csv django http 响应

转载 作者:太空狗 更新时间:2023-10-30 01:50:32 24 4
gpt4 key购买 nike

在一个 View 中,我使用简单的 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 可以解析它?

最佳答案

response.content 提供字节。您需要将其解码为字符串:

foo = response.content.decode('utf-8')

然后使用 io.StringIO 将此字符串传递给 csv 阅读器:

import io
reader = csv.reader(io.StringIO(foo))

关于python - 如何读取 csv django http 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38003220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com