Python (unicode错误)和#x27;UnicodeScape';编解码器可以';t解码字节-带'\u';
为Python2.6编写代码,但考虑到Python3,我认为这是一个好主意Python (unicode错误)和#x27;UnicodeScape';编解码器可以';t解码字节-带'\u';,python,unicode,future-proof,Python,Unicode,Future Proof,为Python2.6编写代码,但考虑到Python3,我认为这是一个好主意 from __future__ import unicode_literals 在一些模块的顶部。换句话说,我是在自找麻烦(以避免将来遇到麻烦),但我可能遗漏了一些重要的知识。我希望能够传递一个表示文件路径的字符串,并将对象实例化为 MyObject('H:\unittests') 在Python2.6中,这很好,不需要使用双反斜杠或原始字符串,即使对于以'\u..'开头的目录也是如此,这正是我想要的。在\uuu in
from __future__ import unicode_literals
在一些模块的顶部。换句话说,我是在自找麻烦(以避免将来遇到麻烦),但我可能遗漏了一些重要的知识。我希望能够传递一个表示文件路径的字符串,并将对象实例化为
MyObject('H:\unittests')
在Python2.6中,这很好,不需要使用双反斜杠或原始字符串,即使对于以'\u..'
开头的目录也是如此,这正是我想要的。在\uuu init\uuu
方法中,我确保所有单个\
事件都被解释为“\
”,包括\a
、\b
、\f
、\n
、\r
、\t
和\v
中特殊字符之前的事件(只有\x
仍然是一个问题)。此外,使用(本地)编码将给定字符串解码为unicode也可以正常工作
为准备Python3.x,在编辑器中模拟我的实际问题(从Python2.6中的干净控制台开始),会发生以下情况:
>>> '\u'
'\\u'
>>> r'\u'
'\\u'
(在此之前确定:'\u'
由控制台使用本地编码进行编码)
换句话说,(unicode)字符串根本不会解释为unicode,也不会使用本地编码自动解码。即使对于原始字符串也是如此:
>>> r'\u'
SyntaxError: (unicode error) 'rawunicodeescape' codec can't decode bytes in position 0-1: truncated \uXXXX
与u'\u'
相同:
>>> 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文本应该使所有字符串类型都是unicode。(编辑:)因为,我希望str(“”))
返回这样一个unicode字符串,type(str(“”))
既是
,又是
(因为所有字符串都是unicode),但我也意识到不是
。到处都是混乱
问题
- 如何最好地传递包含“
”的字符串?(不写“\u
”)\\u
- 从未来导入unicode文本的
真的实现了所有Python 3吗。相关的unicode更改,以便获得完整的Python3字符串环境
根本不存在。在我的例子中,我想为Python2(.6)编写可以在Python3中工作的代码。但是,当我导入unicode文本时,我无法检查字符串是否为
,因为:
- 我假设
不是名称空间的一部分unicode
- 如果
是名称空间的一部分,则unicode
的文本在同一模块中创建时仍然是unicode
将始终返回Python 3中unicode文本的type(mystring)
#coding:utf-8
注释编码为“utf-8”,而我的locale.getdefaultlocale()[1]
返回“cp1252”。因此,如果我从控制台调用MyObject('çça')
,它在Python 2中编码为'cp1252',在模块调用MyObject('ça')
时编码为'utf-8'。在Python3中,它不会被编码,而是一个unicode文本
编辑:
我放弃了被允许在u
(或者x
)之前避免使用“\”的希望。我也理解导入unicode\u文本的局限性。然而,将一个字符串从一个模块传递到控制台和vica通过每个不同的编码传递到控制台的许多可能组合,以及在导入unicode\u文本
与否以及Python 2与Python 3之间的组合之上,使我想通过实际测试创建一个概述。因此,下表如下
换句话说,type(str(“”))
在Python3中不返回
,而是
,所有Python2问题似乎都被避免了 AFAIK,from\uuuuuuu future\uuuuuu导入unicode文本所做的一切就是将所有字符串文本设置为unicode类型,而不是字符串类型。即:
>>> type('')
<type 'str'>
>>> from __future__ import unicode_literals
>>> type('')
<type 'unicode'>
始终为str
类型
关于您的r'\u'
问题,它是经过设计的,因为它相当于没有unicode\u文本的ru'\u'
。从文档中:
当'r'或'r'前缀与'u'或'u'前缀一起使用时,将处理\uxxx和\uxxxxx转义序列,而所有其他反斜杠保留在字符串中
可能来自python2系列中词法分析器的工作方式。在python3中,它的工作方式与您(和我)预期的一样
您可以键入两次反斜杠,然后将不会解释\u
,但您将得到两个反斜杠
反斜杠可以用前面的反斜杠转义;然而,这两种情况都存在
所以IMHO,你有两个简单的选择:
- 不要使用原始字符串,并避开反斜杠(与python3兼容):
'H:\\unittests'
- 太聪明了,利用unicode代码点(与python3不兼容):
r'H:\u005unittests'
当您编写包含反斜杠的字符串文字时,如路径(在Windows上)或正则表达式,请使用原始字符串。这就是他们的目的。对我来说,这个问题与版本不更新有关,在本例中是numpy
要修复:
conda install -f numpy
我在Python 3上尝试了以下方法:
导入操作系统
abspath(“yourPath”)
成功了 在这种情况下不行。从“未来”导入unicode文本后,不能再将原始字符串用于包含\u
的字符串。。因此,如果类型(str(“”))
返回
,但是str对象是unicode,并且还应该等于
,当然,这不能同时为真。所以我很困惑…在puthon 3中,所有字符串都是seq
>>> type(str(''))
<type 'str'>
>>> ur'\\u'
u'\\\\u'
conda install -f numpy