【问题标题】:Suppress the u'prefix indicating unicode' in python strings抑制python字符串中的u'前缀表示unicode'
【发布时间】:2010-10-20 04:02:29
【问题描述】:

有没有办法在 python 中全局抑制 unicode 字符串指示符?我在一个应用程序中专门使用 unicode,并做了很多交互的东西。在我的所有调试输出中显示 u'prefix' 是不必要且令人讨厌的。可以关掉吗?

【问题讨论】:

    标签: python string unicode printing


    【解决方案1】:

    您可以使用 Python 3.0.. 默认字符串类型是 unicode,因此不再需要 u'' 前缀..

    简而言之,没有。您无法关闭此功能。

    u 来自unicode.__repr__ 方法,用于在 REPL 中显示内容:

    >>> print repr(unicode('a'))
    u'a'
    >>> unicode('a')
    u'a'
    

    如果我没记错的话,你不能在不重新编译 Python 的情况下覆盖它。

    解决这个问题的最简单方法是简单地打印字符串..

    >>> print unicode('a')
    a
    

    如果您使用 unicode() 内置函数来构造所有字符串,您可以执行类似的操作..

    >>> class unicode(unicode):
    ...     def __repr__(self):
    ...             return __builtins__.unicode.__repr__(self).lstrip("u")
    ... 
    >>> unicode('a')
    a
    

    ..但不要那样做,太可怕了

    【讨论】:

    • 这是一个很好的解决方案。真正的答案是把它吸起来!
    • +1 for me learning python 3个字符串默认都是unicode
    【解决方案2】:

    我有一个案例需要删除 u 前缀,因为我正在使用 python 设置一些 javascript 作为 html 模板的一部分。一个简单的输出将 u 前缀留在 dict 键中,例如

    var turns = [{u'armies':2...];
    

    这会破坏 javascript。

    为了得到所需的输出 javascript,我使用了 json python 模块为我编码了字符串:

    turns = json.dumps(turns)
    

    这在我的特殊情况下可以解决问题,因为键都是 ascii,所以不用担心编码。您可能可以将这个技巧用于您的调试输出。

    【讨论】:

    • 太棒了,json.dumps() 像 repr() 一样递归。需要注意的是,字典键从 int 转换为 str。 assert '{"3": 5}' == json.dumps({3:5})(因为 JavaScript 对象属性 identifiers 都是字符串。)
    【解决方案3】:
    from __future__ import unicode_literals
    

    从 Python 2.6(2008 年 10 月 1 日发布)开始可用。它是 Python 3 的默认设置。

    它允许在源代码中省略 u'' 前缀,尽管它不会更改 repr(unicode_string),这会产生误导。

    您可以在 Python REPL 中覆盖 sys.displayhook(),以显示您喜欢的对象。您还可以为自己的自定义对象覆盖 __repr__

    【讨论】:

    • from future import unicode_literals,在 python 2.7 inpython 控制台中不起作用
    • @AlexLuya 它确实有效(是的,我确实尝试过,以确保)。在新的 Python REPL 中尝试 type(""),您应该会看到 <type 'str'>。然后运行:from __future__ import unicode_literals 并重复 type("")。现在你应该看到<type 'unicode'>。你的环境是什么(操作系统,python 版本)?
    • Ubuntu+ipython+python 2.7
    • type("") 得到"unicode",但是"from nltk.corpus import stopwords",然后"print stopwords.words("english")",'u'' 直到前缀跨度>
    • @AlexLuya 它对我有用,文档明确表示它应该有效:“在交互式解释器提示符下键入的未来语句将对解释器会话的其余部分生效。”
    【解决方案4】:

    使用str( text ) 实际上是一个有点糟糕的主意,因为当你不能 100% 确定你的 python 的默认编码和字符串的确切内容时——后者对于从 Internet 获取的文本来说是典型的。此外,根据您想要做什么,使用print text.encode( 'utf-8' )print repr( text.encode( 'utf-8' ) ) 可能会产生令人失望的结果,因为您可能会得到一个充满不可读代码点的渲染,例如\x3a

    我认为最佳方案是真正利用支持 unicode 的命令行(在 windows 下很难,在 linux 下很容易)并从 python 2.x 切换到 python 3.x。新的 python 3 系列提供的文本与字节处理的易用性和清晰度确实是您可以期待的一大收获。这确实意味着您将不得不花一点时间来学习“字节”和“文本”之间的区别并掌握字符编码的概念,但是那段时间最好花在 python 3 环境中,因为 python 对这些的新方法与 python 2 所提供的相比,令人烦恼的问题更清晰,更不容易出错。回想起来,我什至认为 python 2 处理 unicode 的方法有问题,尽管我曾经认为它是优越的——当我将它与 way this issue is handled in php 进行比较时。

    edit 我刚刚在 SO 上通过 a related discussion 停下来,发现这条评论是关于这些天 php 似乎解决 unicode / 编码问题的方式:

    这就像一只老鼠试图吃掉一个 大象。通过将 Unicode 构建为 ASCII 的扩展(我们有正常的 字符串,我们有 mb_strings) 它 把事情弄错了,并且 挂断什么特殊情况 需要处理字符 有趣的曲线需要更多 一个字节。如果您将 Unicode 视为 为任何人提供一个抽象空间 你需要的字符,ASCII是 容纳在其中,没有任何需要 将其视为特殊情况。

    我在这里引用这个是因为根据我的经验,90% 的 SO python+unicode 主题似乎来自那些曾经对 ascii 或 latin-1 很好的人,被他们不支持的偶尔字符所困扰通常的设置,然后基本上只是想摆脱它。您在切换到 python 3 时所做的正是上述评论者建议做的:您不再将 unicode 视为 ascii 的令人烦恼的扩展,而是开始将 ascii(以及您将遇到的几乎任何其他编码)视为子集(s ) 的 unicode。

    说实话,unicode v6 肯定不是编码领域的最后一个词,但它已接近 2011 年的通用性。习惯它吧。

    【讨论】:

      【解决方案5】:

      什么似乎对我有用:

      import ast
      import json
      j = json.loads('{"one" : "two"}')
      j
      dd = {u'one': u'two'}
      dd
      # to get double quotes
      json.dumps(j,  encoding='ascii')
      json.dumps(dd, encoding='ascii')
      # to get single quotes
      str(ast.literal_eval(json.dumps(j,  encoding='ascii')))
      str(ast.literal_eval(json.dumps(dd, encoding='ascii')))
      

      输出:

      >>> {u'one': u'two'}
      >>> {u'one': u'two'}
      >>> '{"one": "two"}'
      >>> '{"one": "two"}'
      >>> "{'one': 'two'}"
      >>> "{'one': 'two'}"
      

      上述适用于字典和 JSON 对象,这是不言而喻的。

      对于一个字符串,包裹在 str() 中似乎对我有用。

      s=u'test string'
      s
      str(s)
      

      输出:

      >>> u'test string'
      >>> 'test string'
      

      Python 版本:2.7.12

      【讨论】:

        【解决方案6】:

        我知道这不是一个全局选项,但您也可以通过将字符串放在 str() 函数中来抑制 Unicode u。

        所以一个 Unicode 派生列表看起来像:

        >>> myList=[unicode('a'),unicode('b'),unicode('c')]
        >>> myList
        [u'a', u'b', u'c']
        

        会变成这样:

        >>> myList=[str(unicode('a')),str(unicode('b')),str(unicode('c'))]
        >>> myList
        ['a', 'b', 'c']
        

        这有点麻烦,但可能对某些人有用

        【讨论】:

        • 天哪!非常感谢这个“数组内”字符串的创建。
        • 我正在尝试将这些数据交给 PHP 进行解析,尝试在 PHP 中处理这种转换非常令人困惑。我肯定失去了两年的生命。我一直在使用'stories.append(word)',但我把它改成了你神奇的'stories.append(str(unicode(word)))' 并且它全部排序。辉煌@electrice!
        • 呃,绝对**不要这样做**——它会因非 ASCII 数据而崩溃,并首先破坏使用 unicode 的全部目的。如果您依赖于在某处没有u,那么您做错了什么。 @itsricky,您可能希望编码为 JSON,而不是尝试在 PHP 中解析 Python reprs!
        【解决方案7】:

        万一你得到类似u['hello'] 的东西,那么你必须打印一个数组。打印str(arr[0]),你就可以开始了。

        【讨论】:

          【解决方案8】:

          不确定是否使用 unicode,但通常您可以调用 str.encode() 将其转换为更合适的形式。例如,在 Python 3.0+ 中捕获的子进程输出将其捕获为字节流(前缀 'b'),并且 encode() 修复为常规字符串形式。

          【讨论】:

            【解决方案9】:

            试试下面的

            打印 str(result.url)

            可能是您的默认编码已更改。

            您可以使用以下方法检查您的默认编码:-

            > import sys
            > print sys.getdefaultencoding()
            > ascii
            

            默认应为 ascii,这意味着 u'string' 应打印为 'string' 但您的可能已被修改。

            【讨论】:

            • @Nik:如果这回答了您的问题,请将其标记为正确答案。
            【解决方案10】:

            你必须使用print str(your_Variable)

            【讨论】:

              【解决方案11】:

              如果您不想更新到 Python 3,可以使用子字符串。 例如,假设原始输出是 (u'mystring',)。让我们假设变量 row 包含没有 unicode 前缀的“mystring”字符串。然后你会想做这样的事情:

              temp = str(row); #str is not necessary, but probably good practice
              temp = temp[:-3];
              print = temp[3:];
              

              【讨论】:

                猜你喜欢
                • 2019-05-30
                • 2011-01-28
                • 1970-01-01
                • 1970-01-01
                • 2012-12-20
                • 2017-10-20
                • 2017-03-22
                相关资源
                最近更新 更多