我正在使用Google App Engine和Python 2.7进行学校项目。我正在尝试输出嵌套字典,例如:{city:[{song1:artist1},{song2:artist2}], city2:[{song1:artist1},{song2:artist2}]}
。但是,城市名称和歌曲来自世界各地,带有特殊的外国字符。当我打印字典时,得到以下字符串:
{'uOsaka'[{'u\u3086\u3081\u3044\u3089\u3093\u304b\u306d': u'Takajin Yashiki}
等...(大阪是城市,unicode是歌曲,而Takajin是艺术家)
有人知道如何正确显示城市/歌曲的名称吗?
答案 0 :(得分:1)
python 2.7中的潜在问题是打印字典需要将其转换为字符串,并且该字符串将是str
而不是unicode
。因此,您的输出。
但是,当呈现单个项目时,您会发现它们很好:
>>> d = {u'Osaka': [{u'\u3086\u3081\u3044\u3089\u3093\u304b\u306d': u'Takajin Yashiki'}]}
>>> for k, v in d.viewitems():
... for pair in v:
... for song, artist in pair.viewitems():
... print k, song, artist
...
Osaka ゆめいらんかね Takajin Yashiki
请注意,这是Python 2的行为。在str
是文本的Python 3中,假定您已为日语字形安装了必要的字体,此数据将以UTF-8格式打印,并且应在控制台中自然呈现:
(3.7) >>> print(d)
{'Osaka': [{'ゆめいらんかね': 'Takajin Yashiki'}]}
答案 1 :(得分:0)
就像How to print national characters in list representation?一样,您需要使用自定义过程来打印将自己打印字符串而不是它们的repr
的数据:
def nrepr(data):
city_items=[]
for city, jukebox in data.iteritems():
jukebox_items=[]
for song,artist in jukebox.iteritems():
jukebox_items.append(u'"%s":"%s"' % (song,artist) )
city_items.append(u'"%s":{%s}' % (city, u",".join(jukebox_items)))
return u'{%s}' % u",".join(city_items)
>>> data={u'Osaka':{u'\u3086\u3081\u3044\u3089\u3093\u304b\u306d':u'Takajin Yashiki'}}
>>> print nrepr(data)
{"Osaka":{"ゆめいらんかね":"Takajin Yashiki"}}
(在文件开头使用from __future__ import unicode_literals
,以避免将u
放在每个文字之前)
您不必模仿Python的默认输出格式,可以按照自己喜欢的方式打印它们。
或者,您可以将unicode
的子类用于带有国家字符的repr
:
class nu(unicode):
def __repr__(self):
return self.encode('utf-8') #must return str
>>> data={nu(u'Osaka'):{nu(u'\u3086\u3081\u3044\u3089\u3093\u304b\u306d'):nu(u'Takajin Yashiki')}}
>>> data
{Osaka: {ゆめいらんかね: Takajin Yashiki}}
这是有问题的'cuz repr
输出,假定仅包含ASCII字符,并且各种代码都依赖于此。 You are extremily likely to get UnicodeError
s in random places。还将打印mojibake if a specific output channel's encoding is different from utf-8
or if further transcoding is involved.