Estoy realizando una tarea simple de cargar un archivo usando la biblioteca de solicitudes de Python. Busqué Stack Overflow y nadie parecía tener el mismo problema, es decir, que el servidor no recibe el archivo:
import requests
url='http://nesssi.cacr.caltech.edu/cgi-bin/getmulticonedb_release2.cgi/post'
files={'files': open('file.txt','rb')}
values={'upload_file' : 'file.txt' , 'DB':'photcat' , 'OUT':'csv' , 'SHORT':'short'}
r=requests.post(url,files=files,data=values)
Estoy completando el valor de la palabra clave 'upload_file' con mi nombre de archivo, porque si lo dejo en blanco, dice
Error - You must select a file to upload!
Y ahora tengo
File file.txt of size bytes is uploaded successfully!
Query service results: There were 0 lines.
Que aparece solo si el archivo está vacío. Así que estoy atascado en cuanto a cómo enviar mi archivo correctamente. Sé que el archivo funciona porque si voy a este sitio web y completo manualmente el formulario, devuelve una buena lista de objetos coincidentes, que es lo que busco. Realmente agradecería todas las pistas.
Algunos otros hilos relacionados (pero no responden a mi problema):
fuente
files = [('attachment', open('attachment1.txt', 'rb')), ('attachment', open('attachment2.txt', 'rb'))]
. Cada tupla es un par de clave y valor.files={'file':('nameoffile',open('namoffile','rb'),'Content-Type':'text/html','other header'),'file2':('nameoffile2',open('nameoffile2','rb'),'Content-Type':'application/xml','other header')}
pero si se usa files = {}, entonces no se deben usar headers = {'Content-Type': 'blah blah'}. -> @ martijn-pieters: debido a que el tipo de contenido multipart / form-data debe incluir el valor de límite utilizado para delimitar las partes en el cuerpo de la publicación. No configurar el encabezado Content-Type garantiza que las solicitudes lo establezcan en el valor correcto.requests
cierra?with open(...) as fobj:
y utilícelofobj
en elfiles
mapeo.(2018) la nueva biblioteca de solicitudes de Python ha simplificado este proceso, podemos usar la variable 'archivos' para indicar que queremos cargar un archivo codificado en varias partes
fuente
lsof
, parece que el archivo permanece abierto, o al menos así es como interpreto los siguientes resultados. Antes, al ejecutaropen
no hay ningún registro en lalsof
tabla sobrefilename
. Luego, después de queopen
se ejecuta, aparecen varios registros conread
acceso. Después de ejecutar elrequests.post
, los registros siguen ahí indicando que el archivo no se cerró.Carga del cliente
Si desea cargar un solo archivo con la
requests
biblioteca de Python , las solicitudes lib admiten cargas de transmisión , lo que le permite enviar archivos grandes o transmisiones sin leer en la memoria .Lado del servidor
Luego guarde el archivo en el
server.py
lateral de manera que guarde la secuencia en un archivo sin cargarlo en la memoria. A continuación se muestra un ejemplo con el uso de cargas de archivos Flask .O use werkzeug Form Data Parsing como se menciona en una solución para el problema de " cargas de archivos grandes que consumen memoria " para evitar usar la memoria de manera ineficiente en la carga de archivos grandes (st archivo de 22 GiB en ~ 60 segundos. El uso de memoria es constante en aproximadamente 13 MiB.).
fuente
En Ubuntu puedes aplicar de esta manera,
para guardar el archivo en alguna ubicación (temporal) y luego abrirlo y enviarlo a la API
fuente
data
variable?