如此处所述,可以通过一个请求发送多个文件: Uploading multiple files in a single request using python requests module
但是,我在列表中生成这些多个文件处理程序时遇到问题。 所以,假设我想提出这样的请求:
sendfiles = {'file1': open('file1.txt', 'rb'), 'file2': open('file2.txt', 'rb')}
r = requests.post('http://httpbin.org/post', files=sendfiles)
如何从 myfiles 列表中生成 sendfiles ?
myfiles = ["file1.txt", "file20.txt", "file50.txt", "file100.txt", ...]
答案 0 :(得分:3)
使用词典理解,使用os.path.splitext()
从文件名中删除这些扩展名:
import os.path
sendfiles = {os.path.splitext(fname)[0]: open(fname, 'rb') for fname in myfiles}
请注意,两项元组的列表也会这样做:
sendfiles = [(os.path.splitext(fname)[0], open(fname, 'rb')) for fname in myfiles]
当心;使用files
参数发送多部分编码的POST 将首先将所有这些文件读入内存。使用requests-toolbelt
project来构建流式POST主体:
from requests_toolbelt import MultipartEncoder
import requests
import os.path
m = MultipartEncoder(fields={
os.path.splitext(fname)[0]: open(fname, 'rb') for fname in myfiles})
r = requests.post('http://httpbin.org/post', data=m,
headers={'Content-Type': m.content_type})