![](/img/trans.png)
[英]python SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape error
[英](unicode error) 'unicodeescape' codec can't decode bytes - string with '\u'
编写我的Python 2.6代码,但考虑到Python 3,我认为这是一个好主意
from __future__ import unicode_literals
在一些模块的顶部。 换句话说,我要求麻烦(将来要避免它们),但我可能会遗漏一些重要的知识。 我希望能够传递表示文件路径的字符串并实例化一个简单的对象
MyObject('H:\\unittests')
在Python 2.6中 ,这很好用,不需要使用双反斜杠或原始字符串,即使对于以'\\u..\u0026#39;
开头的目录,这正是我想要的。 在__init__
方法中,我确保所有单个\\
都被解释为' \\\\
',包括特殊字符之前的那些,如\\a
, \\b
, \\f
, \\n
, \\r
, \\t
和\\v
(仅限\\x
仍然是一个问题)。 还使用(本地)编码将给定字符串解码为unicode按预期工作。
准备Python 3.x ,在编辑器中模拟我的实际问题(从Python 2.6中的干净控制台开始),会发生以下情况:
>>> '\u'
'\\u'
>>> r'\u'
'\\u'
(好的,直到这里: '\\u\u0026#39;
由控制台使用本地编码进行编码)
>>> from __future__ import unicode_literals
>>> '\u'
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: end of string in escape sequence
换句话说,(unicode)字符串根本不被解释为unicode,也不会使用本地编码自动解码。 对于原始字符串也是如此:
>>> r'\u'
SyntaxError: (unicode error) 'rawunicodeescape' codec can't decode bytes in position 0-1: truncated \uXXXX
同样适合u'\\u\u0026#39;
:
>>> u'\u'
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: end of string in escape sequence
此外,我希望isinstance(str(''), unicode)
返回True
(它没有),因为导入unicode_literals应该使所有字符串类型unicode。 (编辑:)因为在Python 3中,所有字符串都是Unicode字符序列 ,我希望str(''))
返回这样的unicode-string,并type(str(''))
为<type 'unicode'>
和<type 'str'>
(因为所有字符串都是unicode),但也意识到<type 'unicode'> is not <type 'str'>
。 周围的困惑......
问题
如何才能最好地传递包含' \\u\u003c/code> '的字符串?
(不写' \\\\u\u003c/code> ')
from __future__ import unicode_literals
真的实现了所有Python 3.相关的unicode更改,以便我获得完整的Python 3字符串环境?
编辑:在Python 3中,
<type 'str'>
是一个Unicode对象 , <type 'unicode'>
根本不存在。 在我的情况下,我想编写适用于Python 3的Python 2(.6)代码。但是当我import unicode_literals
,我无法检查字符串是否为<type 'unicode'>
import unicode_literals
<type 'unicode'>
因为:
我假设unicode
不是命名空间的一部分
如果unicode
是命名空间的一部分,那么当在同一模块中创建时, <type 'str'>
的文字仍然是unicode
对于Python 3中的unicode文字, type(mystring)
将始终返回<type 'str'>
我的模块用'utf-8'
# coding: UTF-8
为locale.getdefaultlocale()[1]
# coding: UTF-8
注释在顶部,而我的locale.getdefaultlocale()[1]
返回'cp1252'。 因此,如果我从我的控制台调用MyObject('çça')
,它在Python 2中编码为'cp1252',在从模块调用MyObject('çça')
时编码为'utf-8'。 在Python 3中,它不会被编码,而是一个unicode文字。
编辑:
我放弃了希望被允许避免在
u
之前使用'\\'(或x
为此)。 我也理解导入unicode_literals
的局限性。 但是,从模块到控制台传递字符串的许多可能组合,以及每种不同的编码反之亦然,除了导入unicode_literals
和Python 2与Python 3之外,我想通过实际测试创建概述。 因此下表。
换句话说,
type(str(''))
不会在Python 3中返回<type 'str'>
,而是<class 'str'>
,并且似乎可以避免所有Python 2问题。
AFAIK, from __future__ import unicode_literals
所有内容都是使所有字符串文字都是unicode类型,而不是字符串类型。 那是:
>>> type('')
<type 'str'>
>>> from __future__ import unicode_literals
>>> type('')
<type 'unicode'>
但str
和unicode
仍然是不同的类型,它们的行为就像以前一样。
>>> type(str(''))
<type 'str'>
总是,是str
类型。
关于你的r'\\u\u0026#39;
问题,它是设计的,因为它相当于没有unicode_literals
ru'\\ u'。 来自文档:
当'r'或'R'前缀与'u'或'U'前缀一起使用时,处理\\ uXXXX和\\ UXXXXXXXX转义序列,而所有其他反斜杠都保留在字符串中。
可能来自词法分析器在python2系列中的工作方式。 在python3中它可以像你(和我)所期望的那样工作。
您可以键入反斜杠两次,然后
\\u\u003c/code>将不会被解释,但您将获得两个反斜杠!
反斜杠可以使用前面的反斜杠进行转义; 但是,两者都留在字符串中
>>> ur'\\u'
u'\\\\u'
恕我直言,你有两个简单的选择:
不要使用原始字符串,并转义反斜杠(与python3兼容):
'H:\\\\unittests'
太聪明并利用unicode代码点(与python3 不兼容):
r'H:\\unittests'
对我来说这个问题与最新的版本有关,在这种情况下是numpy
修理 :
conda install -f numpy
我在Python 3上尝试这个:
进口口
os.path.abspath则( “yourPath”)
它的工作原理!
当您编写包含反斜杠的字符串文字时,例如路径(在Windows上)或正则表达式,请使用原始字符串。 这就是他们的目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.