将请求的响应保存到文件

Chr*_*rgo 20 python python-2.7 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 responses
file = open("out.xls", "w")
file.write(response)
file.close()
Run Code Online (Sandbox Code Playgroud)

我收到错误:

file.write(response)
TypeError: expected a character buffer object
Run Code Online (Sandbox Code Playgroud)

JGC*_*JGC 24

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

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

响应属性

  • response.text- 包含str响应文本。
  • response.content-包含bytes原始响应内容。

您应该根据您期望的响应类型选择这些属性中的一个或其他。

  • 对于基于文本的响应(html、json、yaml 等),您将使用 response.text
  • 对于基于二进制的响应(jpg、png、zip、xls 等),您将使用response.content.

将响应写入文件

将响应写入文件时,您需要使用具有适当文件写入模式的open 函数

  • 对于您需要使用的文本响应"w"- 纯写模式。
  • 对于您需要使用的二进制响应"wb"- 二进制写入模式。

例子

文本请求并保存

# Request the HTML for this web page:
response = requests.get("https://stackoverflow.com/questions/31126596/saving-response-from-requests-to-file")
with open("response.txt", "w") as f:
    f.write(response.text)
Run Code Online (Sandbox Code Playgroud)

二进制请求并保存

# Request the profile picture of the OP:
response = requests.get("https://i.stack.imgur.com/iysmF.jpg?s=32&g=1")
with open("response.jpg", "wb") as f:
    f.write(response.content)
Run Code Online (Sandbox Code Playgroud)

回答原来的问题

原始代码应该使用wband工作response.content

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", "wb")
file.write(response.content)
file.close()
Run Code Online (Sandbox Code Playgroud)

但我会更进一步,将with 上下文管理器用于open.

import requests

with open('1.pdf', 'rb') as file:
    files = {'f': ('1.pdf', file)}
    response = requests.post("https://pdftables.com/api?&format=xlsx-single",files=files)

response.raise_for_status() # ensure we notice bad responses

with open("out.xls", "wb") as file:
    file.write(response.content)
Run Code Online (Sandbox Code Playgroud)


bha*_*ipu 9

您可以使用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()
Run Code Online (Sandbox Code Playgroud)

  • 或使用 `with open(...): ...` (3认同)

Sai*_*ait -20

正如彼得已经指出的那样:

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
Run Code Online (Sandbox Code Playgroud)

您可能还想检查一下r.text

另外: https: //2.python-requests.org/en/latest/user/quickstart/

  • 我认为你没有回答OP的问题。如何将其保存在文件中。你所做的只是描述“r” (54认同)