我有来自facebook的朋友列表的示例回复:
[{u'uid': 513351886, u'name': u'Mohammed Hossein', u'pic_small': u'http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs643.snc3/27383_513351886_4933_t.jpg'},
{u'uid': 516583220, u'name': u'Sim Salabim', u'pic_small': u'http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs348.snc4/41505_516583220_5681339_t.jpg'}]
我如何通过这个列表将字典的字典编码解析为ascii?我尝试过这样的事情:
response = simplejson.load(urllib.urlopen(REST_SERVER, data))
for k in response:
for id, stuff in k.items():
id.encode("ascii")
logging.debug("id: %s" % id)
return response
但是没有保存编码的密钥,因此我仍然获得unicode值。
答案 0 :(得分:10)
首先:你真的需要这样做吗?这些字符串是Unicode的原因:您根本无法用Unicode表示纯ASCII格式的所有内容。对于你的字典键'uid','name'和'pic_small'来说,这可能不会有问题;但是将它们保留为Unicode可能也不会成为问题。 ('simplejson'库对您的数据一无所知,因此它为每个字符串使用Unicode - 比抱歉更安全。)
反正:
在Python中,无法修改字符串。 .encode
方法不会更改字符串;它返回一个新的字符串,即编码版本。
您要做的是生成一个新的字典,用编码的密钥替换密钥。我们可以通过将每对(编码键,原始值)作为dict构造函数的* args传递来实现。
看起来像:
dict((k.encode('ascii'), v) for (k, v) in original.items())
类似地,我们可以使用列表推导将其应用于每个字典,并创建新列表。 (我们可以就地修改列表,但这种方式更清晰。)
response = simplejson.load(urllib.urlopen(REST_SERVER, data))
# We create the list of modified dictionaries, and re-assign 'response' to it:
response = [
dict((k.encode('ascii'), v) for (k, v) in original.items()) # the modified version
for original in response # of each original dictionary.
]
return response
答案 1 :(得分:5)
你的其他回复暗示了这一点,但是没有说出来:Python中的字典查找和字符串比较在Unicode和ASCII之间透明地转换:
>>> x = {u'foo':'bar'} # unicode key, ascii value
>>> x['foo'] # look up by ascii
'bar'
>>> x[u'foo'] # or by unicode
'bar'
>>> x['foo'] == u'bar' # ascii value has a unicode equivalent
True
因此,对于从JSON转换的字典的大多数用法,您通常不必担心所有内容都是Unicode。