【发布时间】:2010-10-20 04:02:29
【问题描述】:
有没有办法在 python 中全局抑制 unicode 字符串指示符?我在一个应用程序中专门使用 unicode,并做了很多交互的东西。在我的所有调试输出中显示 u'prefix' 是不必要且令人讨厌的。可以关掉吗?
【问题讨论】:
标签: python string unicode printing
有没有办法在 python 中全局抑制 unicode 字符串指示符?我在一个应用程序中专门使用 unicode,并做了很多交互的东西。在我的所有调试输出中显示 u'prefix' 是不必要且令人讨厌的。可以关掉吗?
【问题讨论】:
标签: python string unicode printing
您可以使用 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
..但不要那样做,太可怕了
【讨论】:
我有一个案例需要删除 u 前缀,因为我正在使用 python 设置一些 javascript 作为 html 模板的一部分。一个简单的输出将 u 前缀留在 dict 键中,例如
var turns = [{u'armies':2...];
这会破坏 javascript。
为了得到所需的输出 javascript,我使用了 json python 模块为我编码了字符串:
turns = json.dumps(turns)
这在我的特殊情况下可以解决问题,因为键都是 ascii,所以不用担心编码。您可能可以将这个技巧用于您的调试输出。
【讨论】:
assert '{"3": 5}' == json.dumps({3:5})(因为 JavaScript 对象属性 identifiers 都是字符串。)
from __future__ import unicode_literals
从 Python 2.6(2008 年 10 月 1 日发布)开始可用。它是 Python 3 的默认设置。
它允许在源代码中省略 u'' 前缀,尽管它不会更改 repr(unicode_string),这会产生误导。
您可以在 Python REPL 中覆盖 sys.displayhook(),以显示您喜欢的对象。您还可以为自己的自定义对象覆盖 __repr__。
【讨论】:
type(""),您应该会看到 <type 'str'>。然后运行:from __future__ import unicode_literals 并重复 type("")。现在你应该看到<type 'unicode'>。你的环境是什么(操作系统,python 版本)?
使用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 年的通用性。习惯它吧。
【讨论】:
什么似乎对我有用:
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
【讨论】:
我知道这不是一个全局选项,但您也可以通过将字符串放在 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']
这有点麻烦,但可能对某些人有用
【讨论】:
u,那么您做错了什么。 @itsricky,您可能希望编码为 JSON,而不是尝试在 PHP 中解析 Python reprs!
万一你得到类似u['hello'] 的东西,那么你必须打印一个数组。打印str(arr[0]),你就可以开始了。
【讨论】:
不确定是否使用 unicode,但通常您可以调用 str.encode() 将其转换为更合适的形式。例如,在 Python 3.0+ 中捕获的子进程输出将其捕获为字节流(前缀 'b'),并且 encode() 修复为常规字符串形式。
【讨论】:
试试下面的
打印 str(result.url)
可能是您的默认编码已更改。
您可以使用以下方法检查您的默认编码:-
> import sys
> print sys.getdefaultencoding()
> ascii
默认应为 ascii,这意味着 u'string' 应打印为 'string' 但您的可能已被修改。
【讨论】:
你必须使用print str(your_Variable)
【讨论】:
如果您不想更新到 Python 3,可以使用子字符串。 例如,假设原始输出是 (u'mystring',)。让我们假设变量 row 包含没有 unicode 前缀的“mystring”字符串。然后你会想做这样的事情:
temp = str(row); #str is not necessary, but probably good practice
temp = temp[:-3];
print = temp[3:];
【讨论】: