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

时间:2017-08-17 22:11:33

标签: python python-2.7 unicode jq python-unicode

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']}

为什么即使我使用u,python仍会打印str()个字符?我在其他帖子中读到使用字符串不会在std输出中打印它。是否有任何类似的str()函数可以在任何Python数据对象上工作(而不是自己编写可重用的函数)?

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

3 个答案:

答案 0 :(得分:2)

它仍在打印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

这没关系。你应该让它停止打扰你。但是如果你出于某种疯狂的原因坚持想要摆脱那些u,那么你必须将从JSON反序列化的任意对象中的任何unicode对象转换为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”。你几乎肯定不会,或者至少没有表明你为什么会这样做。

答案 1 :(得分:1)

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

你可以实现:

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

不要忘记查看此网址:https://jqplay.org/它确实帮助我了解/观看jq将如何使用输入数据。

答案 2 :(得分:1)

如果您打算使用python,您可能需要json.dumps()。 e.g

$ 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"]}