【问题标题】:Download a binary file using Python requests module使用 Python requests 模块下载二进制文件
【发布时间】:2016-12-05 13:11:12
【问题描述】:

我需要从外部源下载文件,我正在使用基本身份验证登录到 URL

import requests
response = requests.get('<external url', auth=('<username>', '<password>'))
data = response.json()
html = data['list'][0]['attachments'][0]['url']
print (html)
data = requests.get('<API URL to download the attachment>', auth=('<username>', '<password>'), stream=True)
print (data.content) 

我的输出低于输出

<url to download the binary data> 
\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xcb\x00\x00\x1e\x00\x1e\x00\xbe\x07\x00\x00.\xcf\x05\x00\x00\x00'

我希望该 URL 在同一会话中下载 word 文档。

【问题讨论】:

  • 所以听起来第一步很好(返回你想要的 url?)。您没有做的是从第二个响应中提取数据。 "data = requests.get('', stream=True)" 应该类似于 "data = requests.get('', stream=True) 。文本” ?试试这个并编辑问题,如果它仍然不起作用
  • docs.python-requests.org/en/master/user/advanced/… 并且可能还会在第二个请求中传递auth
  • 我建议您重新阅读请求快速入门文档。要从返回的 Response 对象中获取 二进制 数据,您需要访问其 .content 属性。
  • @PM 2Ring - 我根据您的 cmets 更新了代码,并且能够下载文件的内容。要求是按原样下载文档(在我的情况下,它是一个 docx 文件 - 所以具体来说,我需要下载 docx 文件而不进行任何编码或解码)

标签: python curl python-requests urllib2


【解决方案1】:

工作解决方案

import requests
import shutil

response = requests.get('<url>', auth=('<username>', '<password>'))
data = response.json()
html = data['list'][0]['attachments'][0]['url']
print (html)
data = requests.get('<url>', auth=('<username>', '<password>'), stream=True)
with open("C:/myfile.docx", 'wb') as f:
    data.raw.decode_content = True
    shutil.copyfileobj(data.raw, f) 

我可以按原样下载文件。

【讨论】:

    【解决方案2】:

    当你想直接下载文件时,你可以使用shutil.copyfileobj()

    https://docs.python.org/2/library/shutil.html#shutil.copyfileobj

    您已经将stream=True 传递给requests,这是您获取类似文件的对象所需要的。只需将其作为源传递给copyfileobj()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 2018-08-08
      • 1970-01-01
      相关资源
      最近更新 更多