Wie lade ich Dateien mit der Anforderungsbibliothek von Python hoch?
P粉071559609
P粉071559609 2023-08-16 18:44:37
0
2
648
<p>Ich verwende die Anforderungsbibliothek von Python, um eine einfache Aufgabe zum Hochladen einer Datei auszuführen. Ich habe nach Stack Overflow gesucht und niemand scheint das gleiche Problem zu haben, bei dem die Datei nicht vom Server empfangen wird: </p> <pre class="brush:php;toolbar:false;">Importanfragen url='http://nesssi.cacr.caltech.edu/cgi-bin/getmulticonedb_release2.cgi/post' files={'files': open('file.txt','rb')} Werte={'upload_file': 'file.txt', 'DB':'photcat', 'OUT':'csv', 'SHORT':'short'} r=requests.post(url,files=files,data=values)</pre> <p>Ich habe den Wert des Schlüsselworts „upload_file“ mit meinem Dateinamen ausgefüllt, denn wenn ich es leer lasse, würde es lauten: </p> <pre class="brush:php;toolbar:false;">Fehler – Sie müssen eine Datei zum Hochladen auswählen! </pre> <p>Jetzt bekomme ich: </p> <pre class="brush:php;toolbar:false;">Die Größe der Datei file.txt beträgt Bytes, erfolgreich hochgeladen! Ergebnisse des Abfragedienstes: Es gibt insgesamt 0 Zeilen. </pre> <p>Dies geschieht nur, wenn die Datei leer ist. Daher weiß ich nicht, wie ich meine Datei erfolgreich senden kann. Ich weiß, dass die Datei gültig ist, denn wenn ich das Formular manuell ausfülle und die Website besuche, wird eine schöne Liste mit Übereinstimmungen zurückgegeben, was genau das ist, was ich möchte. Ich bin wirklich dankbar für alle Tipps. </p> <p>Einige andere Threads, die verwandt sind (aber mein Problem nicht lösen): </p> <ul> <li>Python-Skript verwenden, um Dateien per POST zu senden</li> <li>http://docs.python-requests.org/en/latest/user/quickstart/#response-content</li> <li>Anfragen verwenden, um Dateien hochzuladen und zusätzliche Daten zu senden</li> <li>http://docs.python-requests.org/en/latest/user/advanced/#body-content-workflow</li> </ul><p><br /></p>
P粉071559609
P粉071559609

Antworte allen(2)
P粉422227023

(2018) 新的Python requests库简化了这个过程,我们可以使用 'files' 变量来表示我们要上传一个多部分编码的文件

url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}

r = requests.post(url, files=files)
r.text
P粉590428357

如果upload_file是指文件,请使用:

files = {'upload_file': open('file.txt','rb')}
values = {'DB': 'photcat', 'OUT': 'csv', 'SHORT': 'short'}

r = requests.post(url, files=files, data=values)

然后requests将发送一个多部分表单POST请求体,其中upload_file字段设置为file.txt文件的内容。

文件名将包含在特定字段的mime头中:

>>> import requests
>>> open('file.txt', 'wb')  # 创建一个空的演示文件
<_io.BufferedWriter name='file.txt'>
>>> files = {'upload_file': open('file.txt', 'rb')}
>>> print(requests.Request('POST', 'http://example.com', files=files).prepare().body.decode('ascii'))
--c226ce13d09842658ffbd31e0563c6bd
Content-Disposition: form-data; name="upload_file"; filename="file.txt"


--c226ce13d09842658ffbd31e0563c6bd--

请注意filename="file.txt"参数。

如果需要更多控制,可以使用元组作为files映射值,元组的长度应在2到4之间。第一个元素是文件名,其后是内容,还可以选择性地包含内容类型头和其他头的映射:

files = {'upload_file': ('foobar.txt', open('file.txt','rb'), 'text/x-spam')}

这将设置一个替代文件名和内容类型,省略了可选的头。

如果您希望整个POST请求体来自文件(没有指定其他字段),则不要使用files参数,直接将文件作为data进行POST。您可能还希望设置一个Content-Type头,否则将不会设置任何头。参见Python requests - POST data from a file

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage