为什么 'u' 前缀仍在打印,即使我使用了 str()?

Why are 'u' prefixes still printing even though I used str()?

新 Python,Python 版本:2.7.10,Machine: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 个字符?我在其他 post 中读到,使用字符串不会在标准输出中打印它。是否有任何类似的 str() 函数可以在任何 Python 数据对象上工作(而不是自己编写一个可重用的函数)?

我希望输出只是 {'giga-10': ['overview']}

它仍在打印 u,因为您的对象中有元素是 unicode 个对象,这就是 python 打印的方式包含 unicode 对象的对象。

>>> 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

这真的不重要。你应该让它停止打扰你。但是如果你出于某种疯狂的原因坚持要摆脱那些 us,那么你必须将任意对象中的任何 unicode 对象转换为 JSON 反序列化为 str 类型.这需要 解码 unicode 对象。只要您不提供任何挂钩,以下内容就适用于 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,即 "byte-strings"。您几乎可以肯定不会,或者至少没有说明您会这样做的任何理由。

为此,为什么不将 jq JQ 实用程序用于一个班轮。

您可以实现:

$ echo `jq ".pages" /tmp/2.json`
{ "giga-10": [ "overview" ] }

不要忘记查看这个 URL:https://jqplay.org/ 它确实帮助我学习/观察了 jq 如何处理输入数据。

如果您要使用 python,您可能需要 json.dumps()。例如

$ cat data.json
{"pages": {"giga-10": ["overview"]}}

$ python -c 'import sys, json; x = json.load(open(sys.argv[1])); print json.dumps(x["pages"])' data.json
{"giga-10": ["overview"]}