在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有str
和bytes
類型之間沒有區別,所以什麼是line.decode()
嗎?
而且這種特定情況下使用cp1252
single-char編碼,其在Python 2個字節不會改變,所以是什麼.decode()
在這種特殊情況下怎麼辦?對於Python 2中的所有單字節編碼,它是NOP?
而且我發現'cp1252'不安全 - 如果輸入字符串包含字節81,8D,8F,90或9D,仍然會有'UnicodeDecodeError:'charmap'codec'。 – 2014-10-20 11:16:27
是的,如果您的字符串包含該編碼的無效字符,默認情況下會引發'UnicodeError'。您可以在調用'decode'時將'error'關鍵字設置爲'ignore'或'replace'來改變這種行爲。 – 2014-10-20 11:19:32
我剛剛用'cp437'替換了'cp1252' - 它包含了所有可能的256字節。 – 2014-10-20 13:38:11