python requests 下载大文件不完整

目前我有一个脚本, 从帝联的 CDN 外链获取一下文件作为备份.
使用的是

Python 2.7.10
requests 2.8.1 

目前碰到一个情况, 使用 requests 下载大文件的时候会出现下载文件不完整的情况, 出现的概率非常大, 应该不会是网络原因导致的. 相关代码概括如下:

requests.adapters.DEFAULT_RETRIES = 5
response = requests.get(url, stream=True)
status = response.status_code
if status == 200:
    total_size = int(response.headers['Content-Length'])
    with open('xxx', 'wb') as of:
        for chunk in response.iter_content(chunk_size=102400):
            if chunk:
                of.write(chunk)
    

下载完毕后我会使用如下方式和上面的 total_size 进行对比

with open('xxx', 'r') as f:
    if isinstance(f, file):
        length = os.fstat(f.fileno()).st_size
        
if total_size == length:
    True
else:
    False
    

代码逻辑如上. 但是对于 100M 以上的文件, 几乎都是保存在本地的文件和获取的响应头里面的 content-length 不一致.
是我 requests 的用法不对吗? 还是有其他更好的办法可以保证文件能完整的下载呢?

阅读 18.5k
4 个回答

网络本来就是不稳定的,下载大文件时网络中断是很正常的事情,只要你有一定的概率成功就可能是网络的问题。

解决方法就是下载后比较大小,如果不完整就断点续传。参考:python 编写断点续传下载软件

另一种方法是调用 curl 之类支持断点续传的下载工具。

在响应体被gzip压缩的情况下,Content-Length是压缩后的大小~ 跟下载之后的文件大小就是会不同。
因此建议用下面这句代码来判断文件下载是否完整,亲测可用。

response.raw.tell() == int(response.headers.get('Content-Length'))

附上一个博客,可以解决下载文件不完整的问题:https://www.jianshu.com/p/f92...

新手上路,请多包涵

response = requests.get(file_url, stream=True)
多线程下载165个文件,也会出现部分文件下载不完整
请问楼主解决了吗,有解决分享一下
感恩~~~

新手上路,请多包涵

楼主有解决这个问题么,同遇到了,没有报任何错误,几M的文件都下载不完整,用法和你一样

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题