Python列表推导仅返回最后一项

时间:2019-03-22 01:44:09

标签: python image python-requests list-comprehension

我正在尝试使用请求发布来发布多个文件。

here表示的格式为:

>>> 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 个答案:

答案 0 :(得分:4)

files的{​​{1}}参数应该是requests.post。请参见示例ES6 Map vs Object: What and When。由于您将其与dict对象一起传递,因此它将在内部强制转换为list对象。在类型转换期间,后一个元素将使用相同的键值覆盖前一个元素!由于其中的所有元素都具有相同的键“视觉效果”,因此只有最后一个元素将保留在最后一个dict对象中。

此问题已在请求的问题页面here中得到解答。

  

您提供给数据的元组列表上已调用dict()。字典(显然)不允许重复的键,但是您的元组列表具有重复的键,因此iterable中的最后一项采用该键的值...因此,我假设这是预期的行为。