2014-10-20 30 views
0

在Python 3中,我必須解碼文件中的行才能從bytes獲得str。爲了使它與Python 2兼容,我以二進制模式打開文件,並在讀取的行上使用.decode()方法(在Python 2中沒有encoding關鍵字open()調用)。Python 2中的`line.decode()`做了什麼?

for line in open('README.txt', 'rb'): 
    # Decode to a fail-safe string for PY3 
    line = line.decode('cp1252') 

在Python 2有strbytes類型之間沒有區別,所以什麼是line.decode()嗎?

而且這種特定情況下使用cp1252single-char編碼,其在Python 2個字節不會改變,所以是什麼.decode()在這種特殊情況下怎麼辦?對於Python 2中的所有單字節編碼,它是NOP

回答

1

decode對Python 2中的字符串給出了一個unicode對象。

你可以用type檢查:

>>> line = "ABC" 
>>> type(line) 
<type 'str'> 
>>> line = line.decode("cp1252") 
>>> type(line) 
<type 'unicode'> 
>>> line 
u'ABC' 
+0

而且我發現'cp1252'不安全 - 如果輸入字符串包含字節81,8D,8F,90或9D,仍然會有'UnicodeDecodeError:'charmap'codec'。 – 2014-10-20 11:16:27

+0

是的,如果您的字符串包含該編碼的無效字符,默認情況下會引發'UnicodeError'。您可以在調用'decode'時將'error'關鍵字設置爲'ignore'或'replace'來改變這種行爲。 – 2014-10-20 11:19:32

+0

我剛剛用'cp437'替換了'cp1252' - 它包含了所有可能的256字節。 – 2014-10-20 13:38:11

2

您應該使用io.open()並獲得相同的行爲在兩個Python 2和3 - >產生Unicode字符串。 Python的3 open()內置的是io.open()io別名也是在Python 2

可用的沒錯,在Python 2 bytesstr的別名;但Python 3中的str不是相同的類型! Python 2的unicode類型被重命名爲strstr.decode()產生unicode對象,就像bytes.decode()產生Python 3 str一樣。

+0

感謝'io.open()'提示 - 我完全錯過了這個東西被添加到了「Python 2.6」中 - 認爲它來自「Python 3」時代。 – 2014-10-20 10:43:01

0

要啓動解碼答案,我們可能需要了解一些基本知識

編碼功能:http://www.tutorialspoint.com/python/string_encode.htm

Python帶有一些內置的編解碼器,無論是作爲C函數或詞典作爲實施映射表。閱讀以下更多 編碼標準:https://docs.python.org/2/library/codecs.html#standard-encodings

解碼功能:可從類似的編碼解碼 教程點必須在其中用於編碼相同的格式來完成。

+0

我認爲'Python 2'在'.decode()'調用之後以某種方式標記了假定編碼的字符串,以後失敗並出現_various_ decode錯誤。現在看起來好像只有一個'ascii編解碼器無法解碼字節錯誤。 – 2014-10-20 10:52:05