簡體   English   中英

如何解決“ UnicodeDecodeError:'ascii'編解碼器無法解碼字節”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM