Понимание списка Python, возвращающее только последний элемент

#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 not request.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. Спасибо. Мне просто нужно будет зациклить каждое изображение и опубликовать его отдельно.