按需通过HTTP读取文件行

时间:2019-05-02 14:54:50

标签: python iterator python-requests lazy-loading urllib

我需要做的是通过HTTP读取块中的文件(具体来说要逐行重复)。我想 读取整个文件(或文件的很大一部分),然后将其拆分为几行,而是读取一小块(<= 8kB)块,然后分成几行。当块中的所有行都用完后,再接收下一个块。

我尝试了以下方法:

with urllib.request.urlopen(url) as f:
  yield from f

哪个没用。在Wireshark中,我发现仅通过调用urlopen(url)就收到了约140kB的总空间〜220kB。

我接下来尝试使用requests

with requests.get(url, stream=True) as req:
  yield from req.iter_lines()

仅通过调用get(url, stream=True)也可以读取大约140kB。根据{{​​3}},这不应发生。除此之外,我没有找到有关此行为或如何控制它的任何信息。我在Windows 10上使用的是Requests 2.21.0,CPython 3.7.3。

1 个答案:

答案 0 :(得分:0)

根据docsdocs 2(并且考虑到源实际上是在块中工作),我认为您应该使用iter_content,它接受​​您必须设置的chunk_size参数到无:

with requests.get(url, stream=True) as req:
    yield from req.iter_content(chunk_size=None)

我还没有尝试过,但是似乎您在代码中的某个地方在req.content之前访问了iter_lines,因此加载了整个有效负载。

edit_添加了示例