字串編碼一直是令人非常頭疼的問題,尤其是我們在處理一些不規範的第三方網頁的時候。雖然python提供了unicode表示的str
和bytes
兩種資料型別,並且可以通過encode()
和decode()
方法轉換,但是,在不知道編碼的情況下,對bytes
做decode()
不好做。
對於未知編碼的bytes
,要把它轉換成str
,需要先「猜測」編碼。猜測的方式是先收集各種編碼的特徵字元,根據特徵字元判斷,就能有很大概率「猜對」。
當然,我們肯定不能從頭自己寫這個檢測編碼的功能,這樣做費時費力。chardet這個第三方庫正好就派上了用場。用它來檢測編碼,簡單易用。
如果安裝了anaconda,chardet就已經可用了。否則,需要在命令列下通過pip安裝:
$ pip install chardet
如果遇到permission denied安裝失敗,**上sudo重試。
chardet.detect()
detect()函式接受乙個引數,乙個非unicode字串。它返回乙個字典,其中包含自動檢測到的字元編碼和從0到1的可信度級別。
當我們拿到乙個bytes
時,就可以對其檢測編碼。用chardet檢測編碼,只需要一行**:
>>> chardet.detect(b'hello, world!')
檢測出的編碼是ascii
,注意到還有個confidence
字段,表示檢測的概率是1.0(即100%)。
我們來試試檢測gbk編碼的中文:
>>> data = '離離原上草,一歲一枯榮'.encode('gbk')
>>> chardet.detect(data)
檢測的編碼是gb2312
,注意到gbk是gb2312的超集,兩者是同一種編碼,檢測正確的概率是74%,language
字段指出的語言是'chinese'
。
對utf-8編碼進行檢測:
>>> data = '離離原上草,一歲一枯榮'.encode('utf-8')
>>> chardet.detect(data)
我們再試試對日文進行檢測:
>>> data = '最新の主要ニュース'.encode('euc-jp')
>>> chardet.detect(data)
可見,用chardet檢測編碼,使用簡單。獲取到編碼後,再轉換為str
,就可以方便後續處理。
response檢測
response = requests.get('')
print(chardet.detect(response.content)) #
大檔案編碼判斷
上面的例子,是一下子讀完,然後進行判斷,但這不適合大檔案。
因此,這裡我們選擇對讀取的資料進行分塊迭代,每次迭代出的資料餵給detector
,當餵給detector資料達到一定程度足以進行高準確性判斷時,detector.done
返回true。此時我們就可以獲取該檔案的編碼格式。
import requests
from chardet.universaldetector import universaldetector
url = ''
response = requests.get(url=url, stream=true)
detector = universaldetector()
for line in response.iter_lines():
detector.feed(line)
if detector.done:
break
detector.close()
print(detector.result) #
至於response.iter_lines()不安全,我們不管,這裡只是用來將資料餵給detector提高準確率。
chardet支援檢測的編碼列表請參考官方文件supported encodings。
使用chardet檢測編碼非常容易,chardet支援檢測中文、日文、韓文等多種語言。
875 愛吃香蕉的珂珂 medium
珂珂喜歡吃香蕉。這裡有 n 堆香蕉,第 i 堆中有 piles i 根香蕉。警衛已經離開了,將在 h 小時後回來。珂珂可以決定她吃香蕉的速度 k 單位 根 小時 每個小時,她將會選擇一堆香蕉,從中吃掉 k 根。如果這堆香蕉少於 k 根,她將吃掉這堆的所有香蕉,然後這一小時內不會再吃更多的香蕉。珂珂喜...
leetcode 875 愛吃香蕉的珂珂
875.愛吃香蕉的珂珂 珂珂喜歡吃香蕉。這裡有 n 堆香蕉,第 i 堆中有 piles i 根香蕉。警衛已經離開了,將在 h 小時後回來。珂珂喜歡慢慢吃,但仍然想在警衛回來前吃掉所有的香蕉。返回她可以在 h 小時內吃掉所有香蕉的最小速度 k k 為整數 示例 1 輸入 piles 3,6,7,11 ...
Leetcode 875 愛吃香蕉的珂珂
珂珂喜歡吃香蕉。這裡有n堆香蕉,第i堆中有piles i 根香蕉。警衛已經離開了,將在h小時後回來。珂珂可以決定她吃香蕉的速度k 單位 根 小時 每個小時,她將會選擇一堆香蕉,從中吃掉k根。如果這堆香蕉少於k根,她將吃掉這堆的所有香蕉,然後這一小時內不會再吃更多的香蕉。珂珂喜歡慢慢吃,但仍然想在警衛...