#python #image #python-requests #list-comprehension
#python #изображение #python-запросы #понимание списка
Вопрос:
Я пытаюсь опубликовать несколько файлов, используя requests post.
Формат, который указан здесь, является:
>>> url = 'http://httpbin.org/post'
>>> multiple_files = [('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]
>>> r = requests.post(url, files=multiple_files)
>>> r.text
Итак, я пытаюсь сделать это с пониманием списка. Но загружается только последнее изображение. У меня такое ощущение, что понимание переопределяет изображения, поскольку все изображения имеют одинаковое имя «визуальные элементы». Но я требовал, чтобы все они имели название «визуальные элементы».
images=[list of image URLS]
files=[('visuals',(str(index) '.jpg',requests.get(image).content,'image/jpeg')) for index,image in enumerate(images)]
requests.post(script.php,files=files)
Например, если имеется 20 изображений, только 20.jpg отправляется на мой script.php .
Ответ на ответ (не работает):
images=response.xpath(root '/photos//url/text()').extract()
visuals=[(str(index) '.jpg',requests.get(image).content,'image/jpeg') for index,image in enumerate(images)]
requests.post(triggers,data={'json':json.dumps(array)},files={'visuals':visuals})
Комментарии:
1. Подождите, если вы сделаете это, как указано в документации, с помощью
open
notrequest.get
, это сработает? Скопируйте этот код:files=[('visuals',(str(index) '.jpg',open(image,'rb'),'image/jpeg')) for index,image in enumerate(images)]
2. но это URL-адреса, а не локальные файлы.
3. Я подозреваю, что для каждой итерации изображения перезаписывается последнее в списке. Я получаю только последнее изображение из-за того же имени, я полагаю?
4. Вы пробовали распечатать результат вашего понимания списка, чтобы убедиться, что он имеет значения, которые, по вашему мнению, имеет?
Ответ №1:
files
Аргументом к requests.post
должен быть dict
. Смотрите пример здесь. Поскольку вы передаете его с list
объектом, оно будет приведено внутренне к dict
объекту. Во время приведения типа последний элемент перезапишет предыдущий элемент с тем же значением ключа! Поскольку все элементы в имеют одинаковый ключ «visuals», в конечном dict
объекте останется только последний.
На этот вопрос уже был дан ответ на странице выдачи запросов # 737.
Для списка кортежей, который вы предоставили данным, вызван dict(). Словари (очевидно) не допускают дублирования ключей, но в вашем списке кортежей есть дубликаты ключей, поэтому последний элемент в iterable принимает значение для этого ключа … итак, я бы предположил, что это предполагаемое поведение.
Комментарии:
1. Но это работает только для одного файла. Мне нужно несколько файлов с одинаковым именем. Когда я выполняю dict с именем, я получаю ошибку «слишком много значений для распаковки», что указывает на его неправильность. Я добавлю код для вашего предложения выше.
2. docs.python-requests.org/en/master/user/advanced/#advanced предполагает иное, чем ваш ответ. Для нескольких с одинаковыми именами используются кортежи с одинаковыми именами.
3. Я боюсь, что невозможно поместить несколько полей данных с одинаковым именем. Это относится к неопределенному поведению в RFC2388 . Оба
requests
иurllib3
не допускают такого использования.4. Я думаю, что документ не очень понятен по этому поводу. Если вы отслеживаете исходный код,
requests
внутренние вызовыurllib3.encode_multipart_formdata
, которые превращают кортеж или список в словарь.5. Спасибо. Мне просто нужно будет зациклить каждое изображение и опубликовать его отдельно.