Python: POST множество многостранно кодирани файлове

Както е описано тук, възможно е да изпратите няколко файла с една заявка: Качване на множество файлове в една заявка с помощта на модул за заявки на python

Имам обаче проблем с генерирането на тези множество манипулатори на файлове от списък. Да кажем, че искам да направя заявка като тази:

sendfiles = {'file1': open('file1.txt', 'rb'), 'file2': open('file2.txt', 'rb')}
r = requests.post('http://httpbin.org/post', files=sendfiles)

Как мога да генерирам sendfiles от списъка myfiles?

myfiles = ["file1.txt", "file20.txt", "file50.txt", "file100.txt", ...]

person AndiPower    schedule 07.04.2014    source източник


Отговори (1)


Използвайте речник за разбиране, като използвате os.path.splitext() за премахване тези разширения от имената на файловете:

import os.path

sendfiles = {os.path.splitext(fname)[0]: open(fname, 'rb') for fname in myfiles}

Обърнете внимание, че списък с кортежи от 2 елемента също ще свърши работа:

sendfiles = [(os.path.splitext(fname)[0], open(fname, 'rb')) for fname in myfiles]

Внимавай; използването на параметъра files за изпращане на кодиран от няколко части POST ще първо прочете всички тези файлове в паметта. Вместо това използвайте requests-toolbelt проекта, за да създадете поточно 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})
person Martijn Pieters    schedule 07.04.2014
comment
очевидно има нещо малко във формата на dict: във въпроса имената на файловете нямат своите разширения по някаква причина. - person njzk2; 07.04.2014