繁体   English   中英

(unicode错误)'unicodeescape'编解码器无法解码字节 - 字符串带'\\ u'

[英](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-8locale.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'>

strunicode仍然是不同的类型,它们的行为就像以前一样。

>>> 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM