Python Requests 下载文件大小不对

在使用 Python 的 requests 库进行文件下载时,可能会遇到文件大小不正确的问题。本文将介绍可能导致这个问题的原因,并提供解决方案。

问题描述

在使用 requests 库下载文件时,有时候会发现下载的文件大小与实际文件大小不一致。例如,下载一个大小为 1MB 的文件,但实际下载的文件却只有几百 KB。

这个问题可能会对我们的应用程序产生负面影响,因为我们无法获知下载的文件是否完整。接下来,我们将分析可能导致这个问题的原因,并提供解决方案。

原因分析

1. 服务器压缩

有些服务器会对响应内容进行压缩,以减少传输的数据量。在这种情况下,服务器会在响应头中添加压缩算法的标识(例如 gzip 或 deflate),同时也会在响应头中添加 Content-Encoding 字段。

当 requests 库接收到这样的响应时,会自动解压缩数据,并返回解压后的内容。这样,我们得到的文件大小就会与实际文件大小不一致。

2. 响应数据流

requests 库默认以文本形式返回响应内容。如果我们尝试将一个二进制文件(例如图片或视频)保存到磁盘上时,我们需要以二进制形式获取响应内容。

在请求时,我们可以将 stream 参数设置为 True,这样就能以二进制形式获取响应内容。但是,如果我们直接使用 content 属性获取了响应内容,那么得到的将是文本形式的数据,而不是二进制数据。

这种情况下,我们将无法正确获取文件的实际大小,因为文本形式的数据会在传输过程中进行编码和解码,从而改变了文件的大小。

解决方案

1. 禁用自动解压缩

如果我们确定服务器对响应内容进行了压缩,我们可以禁用 requests 库的自动解压缩功能。这样,我们就能获取到原始压缩后的文件大小。

下面是一个示例代码,演示如何禁用自动解压缩:

import requests

url = '
headers = {'Accept-Encoding': 'gzip, deflate'}

response = requests.get(url, headers=headers, stream=True)

file_size = int(response.headers.get('Content-Length'))
compressed_data = response.content

在这个代码中,我们通过设置请求头的 Accept-Encoding 字段为 gzip, deflate 来告诉服务器我们可以接受压缩后的数据。然后,我们通过 response.content 属性获取到压缩后的数据。

2. 以二进制形式保存响应内容

如果我们需要保存二进制文件,例如图片或视频,我们应该以二进制形式获取响应内容,并将其保存到磁盘上。

import requests

url = '

response = requests.get(url, stream=True)

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

with open('image.jpg', 'wb') as f:
    for chunk in response.iter_content(chunk_size=8192):
        f.write(chunk)

在这个代码中,我们通过设置 stream 参数为 True 来以二进制形式获取响应内容。然后,我们通过迭代 response.iter_content 方法来逐块保存文件内容。

结论

在使用 Python 的 requests 库下载文件时,可能会遇到文件大小不正确的问题。这个问题的原因可能是服务器对响应内容进行了压缩,或者我们以文本形式获取了响应内容。

为了解决这个问题,我们可以禁用自动解压缩功能,并以二进制形式保存响应内容。这样,我们就能获取到正确的文件大小,并且能够保存完整的文件。

希望本文能够帮助你解决 Python requests 下载文件大小不对的问题。如果你有任何疑问或建议,请在下方留言。