Cómo cargar archivos con la biblioteca de solicitudes de Python

En este tutorial, aprenderá cómo cargar archivos con la biblioteca de solicitudes de Python. Cubriremos la carga de uno o varios archivos en una sola solicitud.

Introducción

Python es compatible con muchas bibliotecas que simplifican la transferencia de datos a través de HTTP. La biblioteca requests es uno de los paquetes de Python más populares, ya que se usa mucho en el web scraping. ¡También es popular para interactuar con servidores! La biblioteca facilita la carga de datos en un formato popular como JSON, pero también facilita la carga de archivos.

En este tutorial, veremos cómo cargar archivos utilizando la biblioteca requests de Python. El artículo comenzará cubriendo la biblioteca requests y la firma de la función post(). A continuación, cubriremos cómo cargar un solo archivo usando el paquete requests. Por último, pero no menos importante, subimos varios archivos en una sola solicitud.

Subir un solo archivo con la biblioteca de solicitudes de Python {#subir un solo archivo con la biblioteca de solicitudes de Python}

Este tutorial cubre cómo enviar los archivos, no nos preocupa cómo se crean. Para continuar, cree tres archivos llamados mi_archivo.txt, mi_archivo_2.txt y mi_archivo_3.txt.

Lo primero que debemos hacer es instalar nuestra biblioteca request en nuestro espacio de trabajo. Si bien no es necesario, se recomienda que instale bibliotecas en un entorno virtual:

1
$ python3 -m venv .

Active el entorno virtual para que ya no impactemos en la instalación global de Python:

1
$ . bin/activate

Ahora vamos a instalar la biblioteca requests con pip:

1
$ pip install requests

Cree un nuevo archivo llamado single_uploader.py que almacenará nuestro código. En ese archivo, comencemos importando la biblioteca requests:

1
import requests

¡Ahora estamos listos para cargar un archivo! Al cargar un archivo, debemos abrirlo y transmitir el contenido. Después de todo, no podemos subir un archivo al que no tenemos acceso. Haremos esto con la función open().

La función open() acepta dos parámetros: la ruta del archivo y el modo. La ruta del archivo puede ser una ruta absoluta o una ruta relativa a donde se ejecuta el script. Si está cargando un archivo en el mismo directorio, solo puede usar el nombre del archivo.

El segundo argumento, modo, tomará el valor "leer binario" representado por rb. Este argumento le dice a la computadora que queremos abrir el archivo en el modo de lectura, y deseamos consumir los datos del archivo en formato binario:

1
test_file = open("my_file.txt", "rb")

Nota: es importante leer el archivo en modo binario. La biblioteca requests generalmente determina el encabezado Content-Length, que es un valor en bytes. Si el archivo no se lee en modo de bytes, la biblioteca puede obtener un valor incorrecto para Content-Length, lo que provocaría errores durante el envío del archivo.

Para este tutorial, haremos solicitudes al servicio gratuito httpbin. Esta API permite a los desarrolladores probar sus solicitudes HTTP. Vamos a crear una variable que almacene la URL en la que publicaremos nuestros archivos:

1
test_url = "http://httpbin.org/post"

Ahora tenemos todo para hacer la solicitud. Usaremos el método post() de la biblioteca requests para cargar el archivo. Necesitamos dos argumentos para que esto funcione: la URL del servidor y la propiedad files. También guardaremos la respuesta en una variable, escribimos el siguiente código:

1
test_response = requests.post(test_url, files = {"form_field_name": test_file})

La propiedad files toma un diccionario. La clave es el nombre del campo de formulario que acepta el archivo. El valor son los bytes del archivo abierto que desea cargar.

Normalmente, para verificar si su método post () fue exitoso, verificamos el código de estado HTTP de la respuesta. Podemos usar la propiedad ok del objeto de respuesta, test_url. Si es cierto, imprimiremos la respuesta del servidor HTTP, en este caso, hará eco de la solicitud:

1
2
3
4
5
if test_response.ok:
    print("Upload completed successfully!")
    print(test_response.text)
else:
    print("Something went wrong!")

¡Vamos a probarlo! En la terminal, ejecuta tu script con el comando python:

1
python single_uploader.py

Su salida sería similar a esto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
Upload completed successfully!
{
  "args": {}, 
  "data": "", 
  "files": {
    "form_field_name": "This is my file\nI like my file\n"
  }, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "189", 
    "Content-Type": "multipart/form-data; boundary=53bb41eb09d784cedc62d521121269f8", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.25.0", 
    "X-Amzn-Trace-Id": "Root=1-5fc3c190-5dea2c7633a02bcf5e654c2b"
  }, 
  "json": null, 
  "origin": "102.5.105.200", 
  "url": "http://httpbin.org/post"
}

Como control de cordura, puede verificar que el valor form_field_name coincida con lo que hay en su archivo.

Subir varios archivos con la biblioteca requests de Python

Cargar varios archivos mediante solicitudes es bastante similar a cargar un solo archivo, con la principal diferencia en nuestro uso de listas. Cree un nuevo archivo llamado multi_uploader.py y el siguiente código de configuración:

1
2
3
import requests

test_url = "http://httpbin.org/post"

Ahora crea una variable llamada test_files que es un diccionario con múltiples nombres y archivos:

1
2
3
4
5
test_files = {
    "test_file_1": open("my_file.txt", "rb"),
    "test_file_2": open("my_file_2.txt", "rb"),
    "test_file_3": open("my_file_3.txt", "rb")
}

Como antes, las claves son los nombres de los campos del formulario y los valores son los archivos en bytes.

También podemos crear nuestras variables de archivos como una lista de tuplas. Cada tupla contiene el nombre del campo de formulario que acepta el archivo, seguido del contenido del archivo en bytes:

1
2
3
test_files = [("test_file_1", open("my_file.txt", "rb")),
              ("test_file_2", open("my_file_2.txt", "rb")),
              ("test_file_3", open("my_file_3.txt", "rb"))]

¡Cualquiera funciona, así que elige el que prefieras!

Una vez que la lista de archivos esté lista, puede enviar la solicitud y verificar su respuesta como antes:

1
2
3
4
5
6
7
test_response = requests.post(test_url, files = test_files)

if test_response.ok:
    print("Upload completed successfully!")
    print(test_response.text)
else:
    print("Something went wrong!")

Ejecute este script con el comando python:

1
$ python multi_uploader.py

Verás este resultado:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Upload completed successfully!
{
  "args": {}, 
  "data": "", 
  "files": {
    "test_file_1": "This is my file\nI like my file\n", 
    "test_file_2": "All your base are belong to us\n", 
    "test_file_3": "It's-a me, Mario!\n"
  }, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "470", 
    "Content-Type": "multipart/form-data; boundary=4111c551fb8c61fd14af07bd5df5bb76", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.25.0", 
    "X-Amzn-Trace-Id": "Root=1-5fc3c744-30404a8b186cf91c7d239034"
  }, 
  "json": null, 
  "origin": "102.5.105.200", 
  "url": "http://httpbin.org/post"
}

¡Buen trabajo! ¡Puede cargar archivos individuales y múltiples con solicitudes!

Conclusión

En este artículo, aprendimos cómo cargar archivos en Python usando la biblioteca requests. Cuando se trata de un solo archivo o de varios archivos, solo se necesitan algunos ajustes con el método post(). También verificamos nuestra respuesta para asegurarnos de que nuestras cargas fueran exitosas.