使用Python请求库保存大文件

Mat*_*son 85 python http file download request

可能重复:
如何使用请求下载图像

我知道获取URL非常简单requests.get,我可以获取原始响应体并将其保存到文件中,但是对于大文件,有没有办法直接流式传输到文件?就像我正在下载带有它的电影一样?

Ble*_*der 166

奇怪的是,请求对此没有任何简单的要求.您将不得不迭代响应并将这些块写入文件:

response = requests.get('http://www.example.com/image.jpg', stream=True)

# Throw an error for bad status codes
response.raise_for_status()

with open('output.jpg', 'wb') as handle:
    for block in response.iter_content(1024):
        handle.write(block)
Run Code Online (Sandbox Code Playgroud)

我通常只是用urllib.urlretrieve().它可以工作,但如果您需要使用会话或某种身份验证,上述代码也可以正常工作.

  • @jdotjdot:像`requests.get(...).save('file.txt')` (8认同)
  • 这是一个非常好的观点.有人应该向Kenneth Reitz指出 - 或者可能向项目提交拉动请求? (7认同)
  • 只需注意 - 在最新版本的请求中,预取arg已更改为流.所以在这里使用stream = True. (5认同)
  • 此代码不检查状态代码,而只是将服务器的响应消息作为字符串写入文件,以防出现问题.我建议在`get`行之后插入`if not request.ok:return False` (5认同)
  • @zsero如果你想在响应代码不在200-206范围内时引发异常,你也可以使用`response.raise_for_status()` (5认同)
  • @Blender @rikAtee我在代码中挖了一下,我非常有信心你不必检查一个错误的`block`:`requests.Response.iter_content()`[调用`stream()`](保存在`raw`中的`urllib3.Response`上的https://github.com/kennethreitz/requests/blob/master/requests/models.py#L657).`stream()`设计为[handle](https://github.com/shazow/urllib3/blob/master/urllib3/response.py#L448)[EMOF(https://github.com/shazow/ urllib3 /斑点/主/ urllib3/response.py#L309). (2认同)