一、实验环境
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