Python 将请求的响应保存到文件

Python 将请求的响应保存到文件,python,file-io,python-requests,Python,File Io,Python Requests,我正在使用将PDF上载到API。它存储为下面的“响应”。我正试着把这些写在Excel上 import requests files = {'f': ('1.pdf', open('1.pdf', 'rb'))} response = requests.post("https://pdftables.com/api?&format=xlsx-single",files=files) response.raise_for_status() # ensure we notice bad re

我正在使用将PDF上载到API。它存储为下面的“响应”。我正试着把这些写在Excel上

import requests

files = {'f': ('1.pdf', open('1.pdf', 'rb'))}
response = requests.post("https://pdftables.com/api?&format=xlsx-single",files=files)
response.raise_for_status() # ensure we notice bad responses
file = open("out.xls", "w")
file.write(response)
file.close()
我得到了一个错误:

file.write(response)
TypeError: expected a character buffer object
正如已经指出的那样:

In [1]: import requests

In [2]: r = requests.get('https://api.github.com/events')

In [3]: type(r)
Out[3]: requests.models.Response

In [4]: type(r.content)
Out[4]: str
您可能还需要检查
r.text


另外:

您可以使用
response.text
写入文件:

import requests

files = {'f': ('1.pdf', open('1.pdf', 'rb'))}
response = requests.post("https://pdftables.com/api?&format=xlsx-single",files=files)
response.raise_for_status() # ensure we notice bad responses
file = open("resp_text.txt", "w")
file.write(response.text)
file.close()
file = open("resp_content.txt", "w")
file.write(response.text)
file.close()

我相信所有现有的答案都包含相关信息,但我想总结一下

requests
get和post操作返回的响应对象包含两个有用的属性:

响应属性
  • response.text
    -包含带有响应文本的
    str
  • response.content
    -包含带有原始响应内容的
    字节
您应该根据预期的响应类型选择这些属性中的一个或另一个

  • 对于基于文本的响应(html、json、yaml等),您可以使用
    response.text
  • 对于基于二进制的响应(jpg、png、zip、xls等),您可以使用
    response.content
将响应写入文件 在将响应写入文件时,需要使用适当的文件写入模式

  • 对于文本响应,您需要使用
    “w”
    -纯写模式
  • 对于二进制响应,您需要使用
    “wb”
    -二进制写入模式
例子 文本请求和保存
#请求此网页的HTML:
响应=请求。获取(“https://stackoverflow.com/questions/31126596/saving-response-from-requests-to-file")
以open(“response.txt”、“w”)作为f:
f、 写(response.text)
二进制请求和保存
#请求OP的配置文件图片:
响应=请求。获取(“https://i.stack.imgur.com/iysmF.jpg?s=32&g=1")
以open(“response.jpg”、“wb”)作为f:
f、 写(response.content)
回答原来的问题 原始代码应使用
wb
response.content

导入请求
files={'f':('1.pdf',open('1.pdf','rb'))
响应=请求。发布(“https://pdftables.com/api?&format=xlsx-单个”,文件=文件)
响应。针对状态()提出响应。确保我们注意到错误响应
文件=打开(“out.xls”、“wb”)
file.write(response.content)
file.close()文件
但我会更进一步,将
一起使用

导入请求
打开('1.pdf','rb')作为文件:
files={'f':('1.pdf',file)}
响应=请求。发布(“https://pdftables.com/api?&format=xlsx-单个”,文件=文件)
响应。针对状态()提出响应。确保我们注意到错误响应
以open(“out.xls”、“wb”)作为文件:
file.write(response.content)

将open(filename,mode='wb')作为localfile:localfile.write(response.content)
比open and close更简洁优雅,IMHO。跳过前两个答案,直接进入下一步。如果OP能将复选标记移到那个答案上那就太好了——现有的最上面的答案几乎毫无用处,而最上面的答案用处有限。我认为你没有回答OP的问题。如何将其保存到文件中。您所做的只是描述
r
或使用
打开(…):…