Chris J Vargo
Estoy usando Peticiones para subir un PDF a una API. Se almacena como “respuesta” a continuación. Estoy tratando de escribir eso en 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()
Estoy recibiendo el error:
file.write(response)
TypeError: expected a character buffer object
JGC
Creo que todas las respuestas existentes contienen la información relevante, pero me gustaría resumir.
El objeto de respuesta devuelto por requests
Las operaciones get y post contienen dos atributos útiles:
Atributos de respuesta
response.text
– Contienestr
con el texto de respuesta.response.content
– Contienebytes
con el crudo contenido de la respuesta.
Deberás elegir uno u otro de estos atributos en función del tipo de respuesta que esperas.
- Para respuestas basadas en texto (html, json, yaml, etc.) usaría
response.text
- Para respuestas binarias (jpg, png, zip, xls, etc.) usaría
response.content
.
Escribiendo respuesta al archivo
Al escribir respuestas en el archivo, debe usar el función abierta con el modo de escritura de archivo adecuado.
- Para las respuestas de texto, debe usar
"w"
– modo de escritura simple. - Para respuestas binarias necesitas usar
"wb"
– modo de escritura binaria.
Ejemplos
Solicitud de texto y guardar
# 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)
Solicitud binaria y guardar
# 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)
Respondiendo a la pregunta original
El código original debería funcionar usando wb
y 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()
Pero yo iría más allá y usaría el with
administrador de contexto para 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)
-
¿Cómo saber qué tipo de archivo está recibiendo? Por ejemplo, estoy descargando un archivo de un enlace que me ha dado un usuario y tengo que averiguar qué tipo de escritura debo hacer.
– Farhood ET
29 de noviembre de 2021 a las 8:55
-
Buena pregunta. Visite stackoverflow.com/a/898723/6252525 Esto sugiere usar mimetypes.guess_type(), y luego use una búsqueda para determinar si el tipo mime es binario o no.
– JGC
29 de noviembre de 2021 a las 21:41
bhawnesh dipu
Puedes usar el response.text
para escribir en un archivo:
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
with open("resp_text.txt", "w") as file:
file.write(response.text)
-
o usar
with open(...): ...
– djvg
24 de septiembre de 2020 a las 12:32
Sait
Como ya señaló Pedro:
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
También es posible que desee comprobar r.text
.
También: https://2.python-requests.org/en/latest/user/quickstart/
-
No creo que hayas respondido la pregunta de OP. Cómo guardar eso en un archivo. Todo lo que hiciste fue describir
r
– pauljohn32
2 de febrero de 2018 a las 15:03
file.write(response.content)
.– Pedro Madera
29 de junio de 2015 a las 22:34
with open(filename, mode='wb') as localfile: localfile.write(response.content)
es más limpio y elegante que abierto y cerrado, en mi humilde opinión.– törzsmókus
21 de junio de 2017 a las 12:02
Omita las dos respuestas principales y diríjase directamente a esta. Sería bueno si OP pudiera mover la marca de verificación a esa respuesta: la respuesta principal existente es bastante inútil y la más votada tiene una utilidad limitada.
– ggorlen
27 de enero de 2021 a las 16:43