Ich führe eine einfache Aufgabe zum Hochladen einer Datei mithilfe der Python-Anforderungsbibliothek aus. Ich habe nach Stack Overflow gesucht und niemand schien das gleiche Problem zu haben, nämlich dass die Datei nicht vom Server empfangen wird:
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)
Ich fülle den Wert des Schlüsselworts 'upload_file' mit meinem Dateinamen, denn wenn ich ihn leer lasse, heißt es
Error - You must select a file to upload!
Und jetzt verstehe ich
File file.txt of size bytes is uploaded successfully!
Query service results: There were 0 lines.
Was nur angezeigt wird, wenn die Datei leer ist. Ich bin also nicht sicher, wie ich meine Datei erfolgreich senden soll. Ich weiß, dass die Datei funktioniert, denn wenn ich auf diese Website gehe und das Formular manuell ausfülle, wird eine schöne Liste übereinstimmender Objekte zurückgegeben, nach der ich suche. Ich würde mich wirklich über alle Hinweise freuen.
Einige andere Themen im Zusammenhang (aber nicht mein Problem zu beantworten):
quelle
files = [('attachment', open('attachment1.txt', 'rb')), ('attachment', open('attachment2.txt', 'rb'))]
. Jedes Tupel ist ein Paar aus Schlüssel und Wert.files={'file':('nameoffile',open('namoffile','rb'),'Content-Type':'text/html','other header'),'file2':('nameoffile2',open('nameoffile2','rb'),'Content-Type':'application/xml','other header')}
aber wenn files = {} verwendet wird, dürfen headers = {'Content-Type': 'bla bla'} nicht verwendet werden! -> @ martijn-pieters: Weil der Inhaltstyp für mehrteilige / Formulardaten den Grenzwert enthalten muss, der zur Abgrenzung der Teile im Post-Body verwendet wird. Wenn Sie den Content-Type-Header nicht setzen, wird er durch Anforderungen auf den richtigen Wert gesetzt.requests
es?with open(...) as fobj:
und verwenden Siefobj
in derfiles
Zuordnung.(2018) Die neue Python-Anforderungsbibliothek hat diesen Prozess vereinfacht. Mit der Variablen 'files' können wir signalisieren, dass wir eine mehrteilig codierte Datei hochladen möchten
quelle
lsof
scheint die Datei offen zu bleiben, oder zumindest interpretiere ich die folgenden Ergebnisse so. Vor dem Ausführen vonopen
gibt es in derlsof
Tabelle keinen Datensatz über dasfilename
. Nachdem dasopen
ausgeführt wurde, werden mehrere Datensätze mitread
Zugriff angezeigt. Nach dem Ausführen vonrequests.post
sind die Datensätze noch vorhanden, um anzuzeigen, dass die Datei nicht geschlossen wurde.Client-Upload
Wenn Sie eine einzelne Datei mit der Python-
requests
Bibliothek hochladen möchten, unterstützt request lib Streaming-Uploads , mit denen Sie große Dateien oder Streams senden können, ohne in den Speicher zu lesen .Serverseite
Speichern Sie die Datei dann so auf der
server.py
Seite, dass der Stream in einer Datei gespeichert wird, ohne in den Speicher geladen zu werden. Im Folgenden finden Sie ein Beispiel für die Verwendung von Uploads von Flask-Dateien .Oder nutzen werkzeug Daten Parsing wie in einer Lösung für das Problem der „erwähnt große Datei - Uploads auffressen Speicher “ , um zu vermeiden Speicher mit ineffizienten auf große Dateien hochladen (st 22 GiB Datei in ~ 60 Sekunden. Der Speicherverbrauch ist konstant bei etwa 13 MiB.).
quelle
In Ubuntu können Sie auf diese Weise anwenden,
um die Datei an einem Ort (vorübergehend) zu speichern und sie dann zu öffnen und an die API zu senden
quelle
data
Variablen?