我有这个......
fileExt = {'png': "'Content-Type': 'image/png'", 'jpe': "'Content-Type':
'image/jpeg'", 'jpg': "'Content-Type': 'image/jpeg'",
'png': "Content-Type': 'image/png'", 'mp4': "'Content-Type': 'video/mpeg'",
'mp3': "'Content-Type': 'audio/mpeg'", '3gp': "'Content-Type': 'video/3gpp'",
'flv': "'Content-Type': 'video/x-flv'", 'flv': "'Content-Type': 'video/x-flv'"}
handler = fileExt.get(ext)
go = "'"+handler
key.copy(key.bucket, key.name, preserve_acl=True, metadata={go})
我收到了这个错误...
Traceback (most recent call last):
File "s3ContentType.py", line 43, in <module>
key.copy(key.bucket, key.name, preserve_acl=True, metadata={go})
File "/task/__pips__/boto/s3/key.py", line 474, in copy
encrypt_key=encrypt_key)
File "/task/__pips__/boto/s3/bucket.py", line 723, in copy_key
headers = boto.utils.merge_meta(headers, metadata, provider)
File "/task/__pips__/boto/utils.py", line 172, in merge_meta
for k in metadata.keys():
AttributeError: 'set' object has no attribute 'keys'
但是如果我在元数据括号中明确地放置一个字符串就可以了。
key.copy(key.bucket, key.name, preserve_acl=True, metadata={'Content-Type': 'image/png'})
什么给出,如何在括号内包含var
答案 0 :(得分:2)
您正在构建两个不同的对象:
foo = {'a', 'b', 'c'}
是set,而
bar = {'a': 'b', 'c': 'd'}
是dictionary。你当然可以在构造一个dict时引用变量:
mimetype = "image/png"
bar = {'Content-Type': mimetype}
字典将键映射到值(因此:
),而集合只是不同值的集合。你正在调用的函数需要一个字典,所以你必须创建一个字典。如果你有一本字典并希望通过它(从上面继续),你可以这样做:
mimetype = "image/png"
bar = {'Content-Type': mimetype}
key.copy(key.bucket, key.name, preserve_acl=True, metadata=bar)
(请注意链接转到python 3文档,但是自python 2以后,set和dicts没有真正改变)
编辑:正如接受的答案所说,你必须使用嵌套字典。问题是,为什么它不起作用?
否则,您正在创建一个包含先前存储在fileExt字典中的字符串的集合,例如“Content-Type:'image / png'”。 Python不会解释这个字符串,这就是为什么它在你写{"Content-Type: 'image/png'"}
时不会创建字典的原因。
答案 1 :(得分:1)
当您说{go}
时,您实际上是在创建set
,而不是dict
。并且套装没有钥匙。
print type({"Welcome"})
print type({"1":"Welcome"})
<强>输出强>
<type 'set'>
<type 'dict'>
但是当你说{'Content-Type': 'image/png'}
时,你实际上是在创建一个dict
,这就是它的工作原理。
答案 2 :(得分:1)
您也可以使用嵌套字典来保存文件扩展名和内容,如
fileExt = {'png': {'Content-Type': 'image/png'}, 'jpe': {'Content-Type':'image/jpeg'},
'jpg': {'Content-Type': 'image/jpeg'}, 'png': {'Content-Type': 'image/png'},
'mp4': {'Content-Type': 'video/mpeg'}, 'mp3': {'Content-Type': 'audio/mpeg'},
'3gp': {'Content-Type': 'video/3gpp'}, 'flv': {'Content-Type': 'video/x-flv'},
'flv': {'Content-Type': 'video/x-flv'}}
handler = fileExt.get(ext)
然后你将直接在元数据中使用处理程序,比如
key.copy(key.bucket, key.name, preserve_acl=True, metadata=handler)