按需通过 HTTP 读取文件行



我需要做的是通过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_添加的示例

最新更新