如何使用请求下载二进制文件

bug*_*t17 2 python

我正在尝试下载一个二进制文件并将其以其原始名称保存在磁盘 (linux) 上。

有任何想法吗?

import requests

params = {'apikey': 'xxxxxxxxxxxxxxxxxxx', 'hash':'xxxxxxxxxxxxxxxxxxxxxxxxx'}
response = requests.get('https://www.test.com/api/file/download', params=params)
downloaded_file = response.content

if response.status_code == 200:
    with open('/tmp/', 'wb') as f:
        f.write(response.content)
Run Code Online (Sandbox Code Playgroud)

Den*_*son 6

根据您在评论中的澄清,您的问题是您想保留文件的原始名称。

如果 URL 指向原始二进制数据,则 URL 的最后一部分将是其“原始名称”,因此您可以通过如下解析 URL 来获取它:

local_filename = url.split('/')[-1]
Run Code Online (Sandbox Code Playgroud)

为了将其付诸实践,并考虑到问题的上下文,这里的代码完全符合您的需求,从另一个 SO 问题复制过来

local_filename = url.split('/')[-1]
# NOTE the stream=True parameter
r = requests.get(url, stream=True)
with open(local_filename, 'wb') as f:
    for chunk in r.iter_content(chunk_size=1024): 
        if chunk: # filter out keep-alive new chunks
            f.write(chunk)
            #f.flush() commented by recommendation from J.F.Sebastian
return local_filename
Run Code Online (Sandbox Code Playgroud)

无法将此作为评论发布,因此必须将其放入答案中。我希望我已经足够清楚了。如果您对代码有任何问题,请告诉我。当问题解决后,也请通知我,以便我可以删除它,因为它已经得到了回答。

编辑

这是您的代码的一个版本:

import requests

url = 'https://www.test.com/api/file/download'
params = {'apikey': 'xxxxxxxxxxxxxxxxxxx', 'hash':'xxxxxxxxxxxxxxxxxxxxxxxxx', 'stream':True}
response = requests.get(url, params=params)

local_filename = url.split('/')[-1]
totalbits = 0
if response.status_code == 200:
    with open(local_filename, 'wb') as f:
        for chunk in response.iter_content(chunk_size=1024):
            if chunk:
                totalbits += 1024
                print("Downloaded",totalbits*1025,"KB...")
                f.write(chunk)
Run Code Online (Sandbox Code Playgroud)

注意:如果您不希望它显示进度,只需删除第print15 行上的语句。这是使用此 url 进行测试的:https : //imagecomics.com/uploads/releases/_small/DeadRabbit-02_cvr.jpg 似乎工作得很好。同样,如果您有任何问题,请在下方评论。