Python 从请求流读取csv.reader:迭代器应返回字符串,而不是字节
我试图使用Python 从请求流读取csv.reader:迭代器应返回字符串,而不是字节,python,django,python-3.x,csv,python-requests,Python,Django,Python 3.x,Csv,Python Requests,我试图使用requests.get(url,stream=True)来处理相当大的数据源,将响应流传输到csv.reader。我的代码在python2.7上运行良好。以下是代码: response = requests.get(url, stream=True) ret = csv.reader(response.iter_lines(decode_unicode=True), delimiter=delimiter, quotechar=quotechar, dialect=csv.e
requests.get(url,stream=True)
来处理相当大的数据源,将响应流传输到csv.reader
。我的代码在python2.7上运行良好。以下是代码:
response = requests.get(url, stream=True)
ret = csv.reader(response.iter_lines(decode_unicode=True), delimiter=delimiter, quotechar=quotechar,
dialect=csv.excel_tab)
for line in ret:
line.get('name')
不幸的是,在迁移到python3.6之后,我遇到了以下错误:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
我试图找到一些包装器/装饰器,将response.iter_lines()
迭代器的结果从字节转换为字符串,但没有成功。
我已经尝试使用io
软件包和codec
。使用编解码器。iterdecode
不会将数据按行分割,它可能只是按块大小进行分割,
在这种情况下,csv.reader
以以下方式抱怨:
_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
我猜你可以把它包装在一个genexp
中,并将解码后的行输入其中:
from contextlib import closing
with closing(requests.get(url, stream=True)) as r:
f = (line.decode('utf-8') for line in r.iter_lines())
reader = csv.reader(f, delimiter=',', quotechar='"')
for row in reader:
print(row)
使用3.5
中的一些示例数据,这将关闭csv.reader
,送入它的每一行都将首先在genexp中解码。另外,我正在使用“按原样”来自动关闭响应。iter\u lines()是一个生成器,因此我无法在该(?)上解码()。另一方面,生成器上使用的lambda表达式不会用所有数据填充我的内存吗?我想略去这一点,这就是为什么我首先要流媒体。你是对的,那是行不通的。您必须创建一个生成器来调用原始生成器并动态解码字节。“我不知道该怎么做。”让·弗朗索瓦·法布说得对,正如我所想。。。我可能会为此编写一些包装生成器,但也许有人会想出一个更漂亮的解决方案。对,genexp已经足够好了。谢谢你的
结尾部分,我没有意识到这一点。