python讀取未知編碼檔案

2021-10-07 13:11:56 字數 2700 閱讀 8541

結合檢測編碼和讀取內容

參考文件

在開發日誌分析功能時,需要讀取不同編碼的檔案然後對檔案內容進行解析,那麼首先要解決的就是如何檢測編碼的問題。

為了方便演示,先建立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...