Skip to content

[Python] 使用 “chardet” 套件判斷文件的編碼

在我們使用 Python 讀取文件時、或者是我們在使用任何我們可能的編輯器打開文件時,偶爾會發生我們因為使用錯誤的編碼打開我們的文件,導致文件裡的文字呈現一片亂碼的狀態。

我們當然不樂見這樣的情況,所以能夠精確地知道文件中的編碼到底是什麼——這就成了一件相當重要的事情。

今天要紀錄的,便是在 Python 當中一個相當便於解決這個問題的函式庫 “chardet”。當然,這個方便的工具很多時候只能幫助我們猜測『文件是什麼樣的編碼』,並沒有辦法在任何情境下都能解決問題,要先做好這樣的心理建設。

以下,我就來測試個實際的例子。


chardet

如果環境中並沒有安裝這個套件,那麼我們可以使用以下指令安裝:

sudo pip3 install chardet

然後,假設我有一個不知道什麼編碼的檔案 “test_01.txt” 在我的電腦中,那麼我就可以使用以下程式碼去分析這個文件屬於哪種編碼:

import chardet

text = open('test_01.txt', 'rb').read()
print(chardet.detect(text))



Output:

{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}

要小心注意的地方是,讀取進來的模式我們必須選擇二進制的 “rb”。畢竟 Python 預設是使用 Unicode 讀取的,故這樣一個我們無法判斷編碼的文件,若冒然直接讀取,常常是會報錯的。

然後我們可以看到,這個文件屬於『簡體中文』,畢竟其編碼為簡中著名的 “GB2312″。另外很方便的是, “chardet” 套件會給予一個 “confident” 作為信心度,正如同我上方所說的,這個套件並不是一個可以完美解決所有問題的方法,所以我們也許可以參考 “chardet” 分析結果的信心程度。

看完了個快樂的例子,接著我們來看著比較失敗的例子。假設我的電腦中同樣存在著另外一個我不知道編碼的文件 “test_02.txt” (這個文件到現在我都還不知道編碼 XDDD)。

import chardet

text = open('test_02.txt', 'rb').read()
print(chardet.detect(text))



Output:

{'encoding': None, 'confidence': 0.0, 'language': None}

這就是我所說的無法適用於每種情況。我們可以看到 “chardet” 毫無信心,既不知道編碼也不知道是什麼語言。


References

Leave a Reply