Python中⽂件编码的检测
前⾔:
⽂件打开的原则是“以什么编码格式保存的,就以什么编码格式打开 ”,我们常见的⽂件⼀般是以“ utf-8 ”或“ GBK ”编码进⾏保存的,由于编辑器⼀般设置了默认的保存和打开⽅式,所以我们在记事本或常见⽂档编辑器如Word中不容易看到乱码的情况发⽣,但是,当我们要在内存⾥读取打开⼀个⽂件时,如果⽂档编码⽅式和计算机内存默认读取⽂件的编码不同,或者我们打开⽂件时未设置正确的编码打开规则,则很有可能出现⼀堆乱码,⽆法正常读取⽂件内容,影响接下来的⼯作。
其实,这些情况早就有⼤佬想到了,所以开发了⼀个类似机器学习的第三⽅Python包,名为“ chardet ”,通过分析⽂件的内容,来推断⽂档的编码格式,然后返回⼀个报告,提⽰我们检测的⽂档最有可能的编码格式和语⾔。今天我们⼀起来学习⼀下,这个很有意思的⼩技巧。
⼀、⽂件打开模式
这⾥介绍⼀下待会涉及到的⽂件打开⽅式,⼀个是 “ r ” ,即只读模式,只对⽂档进⾏读取,不作修改;另⼀种是 “ rb ” ,即⼆进制模式,读取的⽂档以⼆进制字符串表⽰(⼀般⽂档、图⽚和视⾳频等⽂件为了便于储存、传输的需要,在硬盘上以⼆进制字符串的形式存在),更直观的说,就是把⽂件原封不动的从硬盘⾥读出来,不进⾏解码,难以阅读。
⼆、⽂件打开⽅法
文档字符串是什么 ⽂件打开⼀般会遇到以下两种情况
1、已知⽂件保存的编码格式,则读取时,指定对应的编码格式即可正常读取。
⾸先我们先新建⼀个⽂档,命名为 “ ”,以“ utf-8 ”编码格式保存,内容如下:
你好,明天!
⽂件打开⼀般⽅法如下:
f = open(file="filename",mode="r",encoding="utf-8") #⽂件名最好带后缀,编码格式按已知的⽂件编码填,此处以 utf-8 为例
实例如下:已知⼀个⽂件是以 utf-8 编码的,则打开时的编码也是 utf-8。
#!-*- coding:utf-8 -*-
f1 = open(file="",mode='r',encoding="utf-8") # 打开⽂件
data = f1.read() # 读取⽂件
print(data) # 输出:你好,明天!
f1.close() # 关闭⽂件
2、⽂件保存时的编码格式未知,打开时⽆法设置编码⽅式,使得读取乱码。此时的解决⽅法有两种:
(1)⼀种是不去理会⽂件的编码格式,只交给计算机读取,保存和传输(不⽤给⼈看),以⼆进制模式打开,即 mode设为 “ rb ”即可,⽅法如下:
#!-*- coding:utf-8 -*-
f2= open(file="",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
注意,由于在测试时发现,⽂件内容过少时,检测结果有较⼤偏差(识别为“ IBM855 ”),所以这⾥我重新新建⼀个测试⽂件 “”,保存时的编码格式为“utf-8 ”(假设此⽂件编码格式未知),⽂件内容如下:
你好,明天!
现在,您已经可以向标准输⼊和输出进⾏读写。现在,来看看怎么读写实际的数据⽂件。
Python 提供了必要的函数和⽅法进⾏默认情况下的⽂件基本操作。你可以⽤ file 对象做⼤部分的⽂件操作。
open 函数
你必须先⽤Python内置的open()函数打开⼀个⽂件,创建⼀个file对象,相关的⽅法才可以调⽤它进⾏读写。
测试代码如下:
#!-*- coding:utf-8 -*-
import chardet
f3 = open(file="",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”等,经过测试发现,这个参数并不是所有⽂件都能被检测出来 此时,我们就可以按照检测得到的结果,按照已知⽂件编码格式的情况,查看⽂件内容即可。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论