Python: POST несколько файлов с кодировкой из нескольких частей

Как описано здесь, можно отправить несколько файлов с одним запросом: request-module">Загрузка нескольких файлов в одном запросе с помощью модуля запросов 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}

Обратите внимание, что список кортежей из двух элементов тоже подойдет:

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