为什么 '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
这真的不重要。你应该让它停止打扰你。但是如果你出于某种疯狂的原因坚持要摆脱那些 u
s,那么你必须将任意对象中的任何 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"]}
新 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
这真的不重要。你应该让它停止打扰你。但是如果你出于某种疯狂的原因坚持要摆脱那些 u
s,那么你必须将任意对象中的任何 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"]}