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

时间:2018-11-01 12:48:06

标签: 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)

1 个答案:

答案 0 :(得分:1)

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

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

local_filename = url.split('/')[-1]

将其付诸实践,并考虑问题的上下文,以下代码正是您所需要的代码,它是从another SO question复制而来的:

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

无法将此内容发表为评论,因此必须将其放入答案中。我希望我已经足够清楚了。告诉我代码是否有问题。问题解决后,请同时通知我,以便我可以删除它,因为它已经得到答复。

编辑

以下是您的代码的版本:

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)

注意:如果您不希望它显示进度,只需删除第15行上的print语句即可。使用以下URL进行了测试:https://imagecomics.com/uploads/releases/_small/DeadRabbit-02_cvr.jpg,它似乎运行得很好。再次,如果您有任何问题,请在下面留言。