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']}
答案 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"]}