一、實驗環境
1.Windows10x64
2.anaconda4.6.9 + python3.7.1(anaconda集成,不需單獨安裝)
二、任務需求
封裝API,用於解析各式文件,獲取需要的結果值。
三、問題描述
解析某個工具生成的Log,解析代碼如下:
with open("BIT_log_191230_164145.log","r") as f: f = f.readlines()
python腳本讀取后全部是亂碼;或者前半部分正常,后半部分程序報錯。報錯信息如下:
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xff in position
四、解決方式
4.1 獲取文件編碼方式
- 右擊文件,選擇使用UltraEdit打開
- 單擊選擇 UltraEdit -> 編輯 -> 十六進制功能 -> 十六進制編輯 或者按Ctrl + H
- 根據文件頭判斷文件編碼方式
- 根據如下清單進行判斷
EF BB BF UTF-8 FE FF UTF-16/UCS-2, little endian FF FE UTF-16/UCS-2, big endian FF FE 00 00 UTF-32/UCS-4, little endian 00 00 FE FF UTF-32/UCS-4, big-endian
該方式並非100%有效,因為文件頭不是必須的,所以有些文件沒有文件頭
4.2 使用指定編碼方式讀取文件
with open("part2id.txt","r",encoding="gbk") as f: f = f.readlines()
4.3 手動遍歷常用編碼方式
如果4.1方式無法獲取文件編碼方式,手動指定,一個個嘗試,直到正確解析文件為止。
五、其他解決方式
5.1 讀取文件忽略報錯
with open("part2id.txt","r",encoding="gbk",errors="ignore") as f: f = f.readlines()
5.2 使用二進制方式讀取文件
with open("BIT_log_191230_164145.log",mode="rb") as f: f = f.readlines()
參考文檔1:http://www.niumou.com.cn/211
參考文檔2:https://blog.csdn.net/liyjupc/article/details/49928911