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

2024-09-27 21:34:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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字符?我在另一篇文章中读到,使用string不会在std输出中打印它。有没有类似的str()函数可以处理任何Python数据对象(而不是自己编写一个可重用的函数)?你知道吗

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


Tags: 函数importjsonsysoverviewloadpagesopen
3条回答

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

>>> x = {u'giga-10': [u'overview']}
>>> print x
{u'giga-10': [u'overview']}

unicode对象是有意义的,因为您正在反序列化JSON,而对应于JSON字符串的适当数据结构是python2 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']}

但是没有很好的理由这样做,除非您真的需要python2str,即“字节字符串”。你几乎可以肯定没有,或者至少,没有指出任何理由。你知道吗

如果要使用python,可能需要json.dumps()。e、 克

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

为此,为什么不将jqJQ实用程序用于单行程序呢。你知道吗

您可以实现:

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

别忘了检查一下这个URL:https://jqplay.org/它真的帮助我学习/观察了jq如何处理输入数据。你知道吗

相关问题 更多 >

    热门问题