chardet模块的使用
1.介紹
在處理字符串時,常常會遇到不知道字符串是何種編碼,如果不知道字符串的編碼就不能將字符串轉換成需要的編碼。面對多種不同編碼的輸入方式,是否會有一種有效的編碼方式?chardet是一個非常優秀的編碼識別模塊。
$ pip install chardet
2.簡單使用
使用chardet
當我們拿到一個bytes時,就可以對其檢測編碼。用chardet檢測編碼,只需要一行代碼:
>>> chardet.detect(b'Hello, world!')
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
檢測出的編碼是ascii,注意到還有個confidence字段,表示檢測的概率是1.0(即100%)。
我們來試試檢測GBK編碼的中文:
>>> data = '離離原上草,一歲一枯榮'.encode('gbk')
>>> chardet.detect(data)
{'encoding': 'GB2312', 'confidence': 0.7407407407407407, 'language': 'Chinese'}
檢測的編碼是GB2312,注意到GBK是GB2312的超集,兩者是同一種編碼,檢測正確的概率是74%,language字段指出的語言是'Chinese'。
對UTF-8編碼進行檢測:
>>> data = '離離原上草,一歲一枯榮'.encode('utf-8')
>>> chardet.detect(data)
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
我們再試試對日文進行檢測:
>>> data = '最新の主要ニュース'.encode('euc-jp')
>>> chardet.detect(data)
{'encoding': 'EUC-JP', 'confidence': 0.99, 'language': 'Japanese'}
可見,用chardet檢測編碼,使用簡單。獲取到編碼后,再轉換為str,就可以方便后續處理。
3.高級使用
當用于檢測的文檔特別大時,可以chardet的子模塊chardet.universaldetector。這個模塊允許我們分多次(逐行讀取或者自行斷行讀?。z測文本的編碼格式,當達到一定的閾值時便可以提前退出檢測。這樣做可以有效地節省資源,提高程序效率,同時保證檢測結果的準確性。
from chardet.universaldetector import UniversalDetector
detector = UniversalDetector() # 初始化一個UniversalDetector對象
f = open('test.txt', 'rb') # test.txt是一個utf-8編碼的文本文檔
for line in f:
detector.feed(line) # 逐行載入UniversalDetector對象中進行識別
if detector.done: # done為一個布爾值,默認為False,達到閾值時變為True
break
detector.close() # 調用該函數做最后的數據整合
f.close()
print(detector.result)
# {'confidence': 1.0, 'encoding': 'UTF-8-SIG'}
需要注意的是:如果對多個不同來源的文本進行檢測,在每次檢測完畢時,必須調用一次UniversalDetector對象的reset函數,將之前的檢測數據清除。否則會導致后面的檢測結果混亂。
轉自:https://www.liaoxuefeng.com/wiki/1016959663602400/1183255880134144
總結
以上是生活随笔為你收集整理的chardet模块的使用的全部內容,希望文章能夠幫你解決所遇到的問題。