Python中文件編碼的檢測

前言:機器學習

  文件打開的原則是「 以什麼編碼格式保存的,就以什麼編碼格式打開 」,咱們常見的文件通常是以「 utf-8 」或「 GBK 」編碼進行保存的,因爲編輯器通常設置了默認的保存和打開方式,因此咱們在記事本或常見文檔編輯器如Word中不容易看到亂碼的狀況發生,可是,當咱們要在內存裏讀取打開一個文件時,若是文檔編碼方式和計算機內存默認讀取文件的編碼不一樣,或者咱們打開文件時未設置正確的編碼打開規則,則頗有可能出現一堆亂碼,沒法正常讀取文件內容,影響接下來的工做。編輯器

  其實,這些狀況早就有大佬想到了,因此開發了一個相似機器學習的第三方Python包 ,名爲「 chardet 」,經過分析文件的內容,來推斷文檔的編碼格式,而後返回一個報告,提示咱們檢測的文檔最有可能的編碼格式和語言。今天咱們一塊兒來學習一下,這個頗有意思的小技巧。ide

 

1、文件打開模式函數

  這裏介紹一下待會涉及到的文件打開方式,一個是 「 r 」 ,即只讀模式,只對文檔進行讀取,不做修改;另外一種是 「 rb 」 ,即二進制模式,讀取的文檔以二進制字符串表示(通常文檔、圖片和視音頻等文件爲了便於儲存、傳輸的須要,在硬盤上以二進制字符串的形式存在),更直觀的說,就是把文件原封不動的從硬盤裏讀出來,不進行解碼,難以閱讀。學習

 

2、文件打開方法測試

  文件打開通常會遇到如下兩種狀況編碼

  一、已知文件保存的編碼格式,則讀取時,指定對應的編碼格式便可正常讀取。spa

  首先咱們先新建一個文檔,命名爲 「 word1.txt 」,以「 utf-8 」編碼格式保存,內容以下: 命令行

你好,明天!

  文件打開通常方法以下: code

f = open(file="filename",mode="r",encoding="utf-8")   #文件名最好帶後綴,編碼格式按已知的文件編碼填,此處以 utf-8 爲例

  實例以下:已知一個文件是以 utf-8 編碼的,則打開時的編碼也是 utf-8

#!-*- coding:utf-8 -*-
f1 = open(file="word1.txt",mode='r',encoding="utf-8") # 打開文件 data = f1.read() # 讀取文件 print(data) # 輸出 : 你好,明天! f1.close() # 關閉文件

  

  二、文件保存時的編碼格式未知,打開時沒法設置編碼方式,使得讀取亂碼。此時的解決方法有兩種:

  (1)一種是不去理會文件的編碼格式,只交給計算機讀取,保存和傳輸(不用給人看),以二進制模式打開,即 mode設爲 「 rb 」便可,方法以下:

#!-*- coding:utf-8 -*-
 f2= open(file="word1.txt",mode='rb') # 二進制讀取,不指定編碼格式,不然可能報錯
data = f2.read() # 讀取內容
print(data)  # 輸出:b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe6\x98\x8e\xe5\xa4\xa9\xef\xbc\x81'
f2.close()  # 關閉文件

   (2)另外一種則是今天的主角,經過Python第三方包(chardet)幫助咱們檢測文件的編碼格式,而後再按正常模式讀取文件,方法以下:

  首先確保已經安裝 「chardet」包,若沒有安裝,安裝方法以下(已配置Python環境的狀況下,在命令行cmd中輸入如下內容):

pip3 install chardet  # Python2裏換成pip

 

  注意,因爲在測試時發現,文件內容過少時,檢測結果有較大誤差(word1.txt識別爲「 IBM855 」),因此這裏我從新新建一個測試文件 「word2.txt」,保存時的編碼格式爲「 utf-8 」(假設此文件編碼格式未知),文件內容以下: 

你好,明天!

如今,您已經能夠向標準輸入和輸出進行讀寫。如今,來看看怎麼讀寫實際的數據文件。

Python 提供了必要的函數和方法進行默認狀況下的文件基本操做。你能夠用 file 對象作大部分的文件操做。

open 函數
你必須先用Python內置的open()函數打開一個文件,建立一個file對象,相關的方法才能夠調用它進行讀寫。

  測試代碼以下:

#!-*- coding:utf-8 -*-
import chardet f3 = open(file="word2.txt",mode='rb') # 以二進制模式讀取文件
data = f3.read() # 獲取文件內容
print(data) f3.close() # 關閉文件
 result = chardet.detect(data) # 檢測文件內容
print(result) # {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

  檢測結果詳解:

'encoding': 'utf-8'     表示檢測到文件的編碼格式爲 「 utf-8'confidence': 0.99 表示可信度爲百分之九十九 'language': ''          表示文件內容的語言,如 「Chinese」、「English」等,通過測試發現,這個參數並非全部文件都能被檢測出來

  此時,咱們就能夠按照檢測獲得的結果,按照已知文件編碼格式的狀況,查看文件內容便可。

相關文章
相關標籤/搜索