【问题标题】:Why are 'u' prefixes still printing even though I used str()?为什么即使我使用了 str(),'u' 前缀仍会打印?
【发布时间】:2018-01-26 11:49:56
【问题描述】:

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

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

【问题讨论】:

  • 这里的str 绝对什么都不做print 隐式使用 str
  • 另外,“使用字符串不会在标准输出中打印它”是不正确的。我不确定你读到了什么,但它要么是错误的,要么是你误解了。
  • 1.你确定你有python链接到python2.7而不是python3吗? 2.你的当前文件夹中有__init__.py文件吗?
  • @Dekel 绝对是 Python 2。

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


【解决方案1】:

如果你打算使用 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"]}

【讨论】:

    【解决方案2】:

    为此,为什么不使用jq JQ 实用程序作为一个衬垫。

    您可以实现:

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

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

    【讨论】:

    • 我喜欢这种使用 jq 的想法
    • 除了与问题无关之外,将echo 与命令替换一起使用是完全没有意义的。只需使用jq ".page" /tmp/2.json。没有理由捕获jq 的标准输出只是为了立即将其写回标准输出。
    【解决方案3】:

    它仍在打印 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,即“字节字符串”。你几乎可以肯定不会,或者至少,没有表明你会这样做的任何理由。

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多