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已经足够好了。谢谢你的
结尾部分,我没有意识到这一点。