我正在尝试下载一个二进制文件并将其以其原始名称保存在磁盘 (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)
根据您在评论中的澄清,您的问题是您想保留文件的原始名称。
如果 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 似乎工作得很好。同样,如果您有任何问题,请在下方评论。