[英]How to solve “UnicodeDecodeError: 'ascii' codec can't decode byte”
我正在編寫一個程序來計算文件中的大約單詞數,並得到一個錯誤消息,指出'ascii' codec can't decode byte
。
如何消除此錯誤?
以下是上述錯誤的回溯:
Traceback (most recent call last):
File "/Users/NikolaMac/Desktop/alice.py", line 23, in <module>
contents = f_obj.read()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)"
這是我的代碼:
filename='alice.txt'
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
else:
# Count the approximate number of words in the file.
words = contents.split()
num_words = len(words)
print("The file " + filename + " has about " + str(num_words) + " words.")
您需要改用io.open
函數,並將其傳遞給編碼。
嘗試這個:
import io
with io.open(filename, encoding='utf-8') as f_obj:
contents = f_obj.read()
print('Words: %d'%len(contents.split(' ')))
該錯誤信息表明它嘗試使用ASCII解碼。 您可能需要指定其他編碼。
我可以看到程序的唯一部分是open
調用。 根據文檔 ,如果您未明確傳遞編碼,
默認編碼取決於平台(無論
locale.getpreferredencoding()
返回什么)
嘗試將encoding='utf-8'
傳遞給open
通話。
我相信那里的所有編碼都會將空格字符編碼為0x20
(根據經驗,沒有確鑿的證據)。 如果您需要做的只是計數字,則可以通過檢查文件中0x20
字節的數量,然后再添加1來跳過解碼過程。 這種簡單的方法將使您大致了解。
使用該方法,您可能必須考慮在文件的開頭或結尾減去空格數,因為這意味着該空格周圍沒有單詞。 UTF-16將空格編碼為0x20 0x00
因此,如果文檔以空格開頭或結尾,則文件的開頭或結尾可能會有一個空字節。 另外,某些編碼在文件的開頭放置了字節順序標記,在這種情況下,文本不是從開頭開始。
您不能在此方法中使用正則表達式,因此如果您要解析基於非拉丁語言的文檔,它將不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.