![](/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.