結合檢測編碼和讀取內容
參考文件
在開發日誌分析功能時,需要讀取不同編碼的檔案然後對檔案內容進行解析,那麼首先要解決的就是如何檢測編碼的問題。
為了方便演示,先建立5個測試檔案(檔名對應編碼):utf8-file,utf8bom-file,gbk-file,utf16le-file,utf16be-file。5個檔案統一寫入以下內容:
abcd
1234
一二三四
chardet是乙個用於編碼檢測的模組,它可以幫助我們識別一段未知格式的位元組是屬於什麼編碼格式。
chardet模組的detect函式接受乙個非unicode字串引數,返回乙個字典。該字典包括檢測到的編碼格式和置信度。
>>
>
import chardet
>>
>
with
open
('utf8-file'
,'rb'
)as f:..
. result = chardet.detect(f.read())
...print
(result)..
.
考慮到有的檔案非常大,如果按照上述方法全部讀入後再判斷編碼格式,效率會變得非常低下,因此使用增量檢測的方式。在這裡我們每次給檢測器傳入一行資料,當檢測器達到最低置信度閾值就可以獲取檢測結果,這樣的話相較於上述方法讀取的內容可能更少,從而可以減少檢測的時間。這個方式的另乙個好處就是分塊讀取檔案內容,不會就記憶體造成過大的壓力。
>>
>
import chardet
>>
>
from chardet.universaldetector import universaldetector
>>
> detector = universaldetector(
)>>
>
with
open
('utf8-file'
,'rb'
)as f:..
.for line in f:..
. detector.feed(line)..
.if detector.done:..
.break..
. detector.close().
..print
(detector.result)..
.
我們將檢測編碼和讀取檔案內容封裝成乙個函式,並對5種編碼格式的檔案進行了測試。以下**在建立universaldetector物件時傳入了languagefilter.chinese引數,這樣可以使檢測結果更加準確。
>>
>
import io
>>
>
import chardet
>>
>
from chardet.universaldetector import universaldetector, languagefilter
>>
>
defreading_unknown_encoding_file
(filename):.
.. detector = universaldetector(languagefilter.chinese)..
.with
open
(filename,
'rb'
)as f:..
.for line in f:..
. detector.feed(line)..
.if detector.done:..
.break..
. detector.close().
.. encoding = detector.result[
'encoding'].
.... f.seek(0)
...for line in f:..
.print
(repr
(line)).
..>>
> reading_unknown_encoding_file(
'utf8-file'
)'abcd\n'
'1234\n'
'一二三四'
>>
> reading_unknown_encoding_file(
'utf8bom-file'
)'abcd\n'
'1234\n'
'一二三四'
>>
> reading_unknown_encoding_file(
'gbk-file'
)'abcd\n'
'1234\n'
'一二三四'
>>
> reading_unknown_encoding_file(
'utf16le-file'
)'abcd\n'
'1234\n'
'一二三四'
>>
> reading_unknown_encoding_file(
'utf16be-file'
)'abcd\n'
'1234\n'
'一二三四'
chardet文件 Python 讀取檔案編碼問題
讀取csv檔案,有時可能會遇見編碼問題。join 是自動在 字串 陣列之間加上 放在set裡用來去重 def csvprocess self flag true 去重處理 產國 大類 型別 with open self.cms data path,encoding utf 8 sig as f re...
python 讀取unicode編碼檔案
參考 import chardet f open a.txt rb text f.read info chardet.detect text print info import chardet f open a.txt encoding utf 16 text f.read print text.e...
Python讀取檔案編碼及內容
最近做乙個專案,需要讀取檔案內容,但是檔案的編碼方式有可能都不一樣。有的使用gbk,有的使用utf8。所以在不正確讀取的時候會出現如下錯誤 unicodedecodeerror gbk codec can t decode byte而且當你使用rb模式讀取檔案時候,返回的結果通過django返回的j...