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