Guardando la respuesta de Solicitudes al archivo

4 minutos de lectura

Avatar de usuario de Chris J. Vargo
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

  • 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


Avatar de usuario de JGC
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 – Contiene str con el texto de respuesta.
  • response.content – Contiene bytes 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

avatar de usuario de bhawnesh dipu
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

Avatar de usuario de Sait
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

¿Ha sido útil esta solución?