J'effectue une tâche simple de téléchargement d'un fichier à l'aide de la bibliothèque de requêtes Python. J'ai cherché Stack Overflow et personne ne semblait avoir le même problème, à savoir que le fichier n'est pas reçu par le serveur:
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)
Je remplis la valeur du mot-clé 'upload_file' avec mon nom de fichier, car si je le laisse vide, il dit
Error - You must select a file to upload!
Et maintenant je reçois
File file.txt of size bytes is uploaded successfully!
Query service results: There were 0 lines.
Ce qui n'apparaît que si le fichier est vide. Je ne sais donc pas comment envoyer mon fichier avec succès. Je sais que le fichier fonctionne car si je vais sur ce site Web et que je remplis manuellement le formulaire, il renvoie une belle liste d'objets correspondants, ce que je recherche. J'apprécierais vraiment tous les indices.
Quelques autres threads liés (mais ne répondant pas à mon problème):
- Envoyer un fichier en utilisant POST à partir d'un script Python
- http://docs.python-requests.org/en/latest/user/quickstart/#response-content
- Télécharger des fichiers à l'aide de demandes et envoyer des données supplémentaires
- http://docs.python-requests.org/en/latest/user/advanced/#body-content-workflow
la source
files = [('attachment', open('attachment1.txt', 'rb')), ('attachment', open('attachment2.txt', 'rb'))]
. Chaque tuple est une paire de clé et de valeur.files={'file':('nameoffile',open('namoffile','rb'),'Content-Type':'text/html','other header'),'file2':('nameoffile2',open('nameoffile2','rb'),'Content-Type':'application/xml','other header')}
mais si files = {} est utilisé alors headers = {'Content-Type': 'blah blah'} ne doit pas être utilisé! -> @ martijn-pieters: car le Content-Type multipart / form-data doit inclure la valeur limite utilisée pour délimiter les parties dans le corps de l'article. Le fait de ne pas définir l'en-tête Content-Type garantit que les requêtes le définissent sur la valeur correcte.requests
ferme- t- il?with open(...) as fobj:
et utilisezfobj
dans lefiles
mappage.(2018) la nouvelle bibliothèque de requêtes python a simplifié ce processus, nous pouvons utiliser la variable 'files' pour signaler que nous voulons télécharger un fichier codé en plusieurs parties
la source
lsof
, il semble que le fichier reste ouvert, ou du moins, c'est ainsi que j'interprète les résultats suivants. Avant, en exécutant le,open
il n'y a pas d'enregistrement dans lalsof
table sur lefilename
. Ensuite, après l'open
exécution de, plusieurs enregistrements apparaissent avecread
accès. Après avoir exécuté lerequests.post
, les enregistrements sont toujours là, indiquant que le fichier ne s'est pas fermé.Téléchargement client
Si vous souhaitez télécharger un seul fichier avec la
requests
bibliothèque Python , alors requests lib prend en charge les téléchargements en continu , qui vous permettent d' envoyer de gros fichiers ou des flux sans lecture en mémoire .Du côté serveur
Ensuite, stockez le fichier sur le
server.py
côté de manière à enregistrer le flux dans un fichier sans le charger dans la mémoire. Voici un exemple d'utilisation des téléchargements de fichiers Flask .Ou utilisez l' analyse des données de formulaire werkzeug comme mentionné dans un correctif pour le problème des « téléchargements de fichiers volumineux qui consomment de la mémoire » afin d' éviter d'utiliser la mémoire de manière inefficace sur le téléchargement de fichiers volumineux (fichier de 22 Gio en ~ 60 secondes. L'utilisation de la mémoire est constante à environ 13 Mio.).
la source
Dans Ubuntu, vous pouvez appliquer de cette façon,
pour enregistrer le fichier à un endroit (temporaire), puis ouvrez-le et envoyez-le à l'API
la source
data
variable?