Python (unicode错误)和#x27;UnicodeScape';编解码器可以';t解码字节-带'\u';

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

为Python2.6编写代码,但考虑到Python3,我认为这是一个好主意

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字符串环境
编辑: 在Python3中,和
根本不存在。在我的例子中,我想为Python2(.6)编写可以在Python3中工作的代码。但是,当我导入unicode文本时,我无法检查字符串是否为
,因为:

  • 我假设
    unicode
    不是名称空间的一部分
  • 如果
    unicode
    是名称空间的一部分,则
    的文本在同一模块中创建时仍然是unicode
  • type(mystring)
    将始终返回Python 3中unicode文本的
我的模块通常通过顶部的
#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