问与答 禁止python字符串中的u'prefix指示unicode'

norman · 2020-02-21 08:12:41 · 热度: 14

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

猜你喜欢:
共收到 11 条回复
isiah #1 · 2020-02-21 08:12:42

您可以使用Python 3.0。默认字符串类型为unicode,因此不再需要unicode()前缀。

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

unicode()来自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

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

timmi #2 · 2020-02-21 08:12:43

我遇到了需要删除u前缀的情况,因为我使用python模板将一些javascript设置为html模板。 一个简单的输出为字典键保留了u前缀,例如

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

这打破了JavaScript。

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

turns = json.dumps(turns)

在我的特定情况下,这可以解决问题,并且由于键都是ascii,因此无需担心编码。 您可能会将此技巧用于调试输出。

jonathan #3 · 2020-02-21 08:12:44
from __future__ import unicode_literals

自python 2.6(2008年10月1日发布)以来可用。 在Python 3中是默认设置。

它允许在源代码中省略sys.displayhook()前缀,尽管它不会更改__repr__,这会引起误解。

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

kendal #4 · 2020-02-21 08:12:45

实际上,每当您不能同时100%地确定python的默认编码和字符串的确切内容时,使用str( text )就是一个不好的主意-从互联网上获取的文本通常使用后者。 此外,根据您要执行的操作,使用print text.encode( 'utf-8' )print repr( text.encode( 'utf-8' ) )可能会产生令人失望的结果,因为您可能会得到诸如2755980938986390590531之类的无法读取的代码点。

我认为最佳选择实际上是利用具有unicode功能的命令行(在Windows下困难,在Linux下容易)并从python 2.x切换到python3.x。 新的python 3系列所提供的文本与字节处理的简单明了,确实是您可以期待的一大收获。 这的确意味着您将不得不花一些时间来学习“字节”和“文本”之间的区别,并掌握字符编码的概念,但是那样的话,在python 3环境中花费的时间要多得多,因为python可以解决这些问题 令人烦恼的问题比python 2所提供的要清晰得多,并且不容易出错。 回想起来,我什至可以称呼python 2解决unicode问题的方法,尽管我曾经认为它是高级的,当我将它与php中解决此问题的方式进行比较时。

编辑我只是在这里进行了相关讨论,因此就这几天php似乎解决unicode / encoding问题的方式发现了此评论:

就像老鼠想吃东西一样   象。 通过将Unicode框架为   ASCII扩展名(我们有正常   字符串,我们有mb_strings)   以错误的方式解决问题,并且   挂在什么特殊情况上   需要处理字符   需要更多的有趣花体   一个字节。 如果您将Unicode视为   为任何人提供抽象空间   您需要的字符,ASCII是   无需任何住宿   将其视为特例。

我在这里引用这是因为,根据我的经验,所有SO python + unicode主题中的90%似乎来自那些过去对ascii或latin-1都比较满意的人,被那些通常情况下不支持的偶尔性格所咬, 然后基本上只是想摆脱它。 切换到python 3时的操作恰恰是上面的注释者建议的操作:您不再将unicode视为ascii的令人讨厌的扩展,而是开始将ascii(以及几乎所有您将遇到的其他编码)视为子集。 )。

确实,unicode v6当然不是编码中的硬道理,但它几乎像2011年一样具有通用性。要习惯它。

garry #5 · 2020-02-21 08:12:46

似乎对我有用的是:

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

pedro #6 · 2020-02-21 08:12:47

我知道这不是一个全局选项,但是您也可以通过将字符串放在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']

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

clarence #7 · 2020-02-21 08:12:48

万一您收到类似u['hello']的内容,则必须打印一个数组。 打印str(arr[0]),您一切顺利。

izaiah #8 · 2020-02-21 08:12:49

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

chasel #9 · 2020-02-21 08:12:50

尝试以下

打印str(result.url)

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

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

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

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

rafaela #10 · 2020-02-21 08:12:51

您必须使用print str(your_Variable)

hudson #11 · 2020-02-21 08:12:52

如果您不想更新到Python 3,则可以使用子字符串。例如,假设原始输出为(u'mystring',)。 为了示例起见,我们假设变量行包含不带unicode前缀的“ mystring”字符串。 然后,您需要执行以下操作:

temp = str(row); #str is not necessary, but probably good practice
temp = temp[:-3];
print = temp[3:];
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册