我需要做的是通过HTTP以块的形式读取文件(具体地迭代行)。我不想读取整个文件(或其中的大部分)然后将其拆分为行,而是读取一小块(<=8kB)然后将其拆分为行。当块中的所有行都被消耗时,然后接收下一个块。
我尝试了以下方法:
with urllib.request.urlopen(url) as f:
yield from f
这行不通。在 Wireshark 中,我看到仅通过调用urlopen(url)
即可接收总共 ~220kB 中的大约 140kB。
我尝试的下一件事是使用requests
:
with requests.get(url, stream=True) as req:
yield from req.iter_lines()
仅通过调用get(url, stream=True)
即可读取大约 140kB。根据文档,这不应该发生。除此之外,我没有找到有关此行为或如何控制它的任何信息。我在 Windows 2.21.0 上使用请求 3.7.3 和 10。
根据文档和文档 2(并且考虑到源代码实际上是在块中工作的),我认为您应该使用iter_content
,它接受您必须设置为 None 的 chunk_size 参数:
with requests.get(url, stream=True) as req:
yield from req.iter_content(chunk_size=None)
我没有尝试过,但似乎在您的代码中的某个地方req.content
访问iter_lines
,因此加载整个有效载荷。
edit_添加的示例