875 python chardet檢測字元編碼

2021-10-08 12:07:37 字數 2278 閱讀 9706

字串編碼一直是令人非常頭疼的問題,尤其是我們在處理一些不規範的第三方網頁的時候。雖然python提供了unicode表示的strbytes兩種資料型別,並且可以通過encode()decode()方法轉換,但是,在不知道編碼的情況下,對bytesdecode()不好做。

對於未知編碼的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根,她將吃掉這堆的所有香蕉,然後這一小時內不會再吃更多的香蕉。珂珂喜歡慢慢吃,但仍然想在警衛...