Python 新手,Python 版本:2.7.10,机器:Mac OS Sierra。
Susi Sushanti Don $ python -c "import sys, json; print(json.load(open('/tmp/2.json'))['pages'])"
{u'giga-10': [u'overview']}
Susi Sushanti Don $ python -c "import sys, json; print(str(json.load(open('/tmp/2.json'))['pages']))"
{u'giga-10': [u'overview']}
为什么即使我使用了 str()
,python 仍然打印 u
字符?我在其他文章中读到,使用字符串不会将其打印在标准输出中。是否有任何类似的 str() 函数可以在任何 Python 数据对象上工作(而不是自己编写可重用的函数)?
我期望输出只是 {'giga-10': ['overview']}
最佳答案
它仍然打印 u
因为你的对象中有一些元素是 unicode
对象,这就是 python 打印包含以下内容的对象的方式:统一码对象。
>>> x = {u'giga-10': [u'overview']}
>>> print x
{u'giga-10': [u'overview']}
拥有 unicode
对象是有意义的,因为您正在反序列化 JSON,并且与 JSON 字符串对应的适当数据结构是 Python 2 unicode
对象。
请注意,如果您打印 unicode
对象,它不会打印 u
,因为 u
实际上并不是一部分unicode 字符串的:
>>> print u"hello"
hello
这真的不重要。你应该让它停止打扰你。但是,如果您出于某种疯狂的原因坚持想要摆脱这些 u
,那么您必须将从 JSON 反序列化的任意对象内的任何 unicode 对象转换为 str
类型。这需要解码 unicode 对象。只要您不提供任何钩子(Hook),以下内容就应该适用于 json.load
的任何结果:
>>> def stringify(obj):
... if isinstance(obj, unicode):
... return obj.encode('utf8')
... elif isinstance(obj, list):
... return [stringify(x) for x in obj]
... elif isinstance(obj, dict):
... return {stringify(k):stringify(v) for k,v in obj.iteritems()}
... else:
... return obj
...
>>> print stringify(x)
{'giga-10': ['overview']}
但是没有充分的理由这样做,除非您确实确实需要 Python 2 str
,即“字节字符串”。您几乎肯定不会这样做,或者至少没有表明您这样做的任何理由。
关于python - 为什么即使我使用了 str(),仍然打印 'u' 前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45745684/