前言:
文件打開的原則是“ 以什么編碼格式保存的,就以什么編碼格式打開 ”,我們常見的文件一般是以“ utf-8 ”或“ GBK ”編碼進行保存的,由於編輯器一般設置了默認的保存和打開方式,所以我們在記事本或常見文檔編輯器如Word中不容易看到亂碼的情況發生,但是,當我們要在內存里讀取打開一個文件時,如果文檔編碼方式和計算機內存默認讀取文件的編碼不同,或者我們打開文件時未設置正確的編碼打開規則,則很有可能出現一堆亂碼,無法正常讀取文件內容,影響接下來的工作。
其實,這些情況早就有大佬想到了,所以開發了一個類似機器學習的第三方Python包 ,名為“ chardet ”,通過分析文件的內容,來推斷文檔的編碼格式,然后返回一個報告,提示我們檢測的文檔最有可能的編碼格式和語言。今天我們一起來學習一下,這個很有意思的小技巧。
一、文件打開模式
這里介紹一下待會涉及到的文件打開方式,一個是 “ r ” ,即只讀模式,只對文檔進行讀取,不作修改;另一種是 “ rb ” ,即二進制模式,讀取的文檔以二進制字符串表示(一般文檔、圖片和視音頻等文件為了便於儲存、傳輸的需要,在硬盤上以二進制字符串的形式存在),更直觀的說,就是把文件原封不動的從硬盤里讀出來,不進行解碼,難以閱讀。
二、文件打開方法
文件打開一般會遇到以下兩種情況
1、已知文件保存的編碼格式,則讀取時,指定對應的編碼格式即可正常讀取。
首先我們先新建一個文檔,命名為 “ word1.txt ”,以“ utf-8 ”編碼格式保存,內容如下:
你好,明天!
文件打開一般方法如下:
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() # 關閉文件
2、文件保存時的編碼格式未知,打開時無法設置編碼方式,使得讀取亂碼。此時的解決方法有兩種:
(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”等,經過測試發現,這個參數並不是所有文件都能被檢測出來
此時,我們就可以按照檢測得到的結果,按照已知文件編碼格式的情況,查看文件內容即可。