Python 文件编码的检测

本文参考于: https://www.cnblogs.com/schut/p/10579955.html

    文件打开的原则是 “以什么编码格式保存的,就以什么格式打开”, 我们常见的文件一般是以“ utf-8 ”或“ GBK ”编码进行保存的,由于编辑器一般设置了默认的保存和打开方式,所以我们在记事本或常见文档编辑器如 Word 中不容易看到乱码的情况发生,但是,当我们要在内存里读取打开一个文件时,如果文档编码方式和计算机内存默认读取文件的编码不同,或者我们打开文件时未设置正确的编码打开规则,则很有可能出现一堆乱码,无法正常读取文件内容,影响接下来的工作。

    其实,这些情况早就有大佬想到了,所以开发了一个类似机器学习的第三方 Python 包 ,名为 “ chardet ”,通过分析文件的内容,来推断文档的编码格式,然后返回一个报告,提示我们检测的文档最有可能的编码格式和语言。今天我们一起来学习一下,这个很有意思的小技巧。

1. 文件打开模式

    (1)“r” 即只读模式。

    (2)“rb” 即二进制模式,一般文档,图片和视音频等文件为了便于储存,传输的需要,在硬盘上以二进制字符串的形式存在,更直观地说,就是把文件原封不动的从硬盘里读出来,不进行解码,难以阅读。

 

2. 文件打开方法

(1)已知文件保存的编码格式,则读取时,指定对应的编码格式即可正常读取。

首先我们先新建一个文档,命名为 “word1.txt”,以 “utf-8” 编码格式保存,内容如下:

你好,未来!

文件打开一般方法如下:

f = open(file="filename", mode="r", encoding="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)文件保存时的编码格式未知,打开时无法设置编码方式,使得读取乱码。

此时,解决方式有三种:

a. 一种是不去理会文件的编码格式,只交给计算机读取,保存和传输(不用给人看),以二进制模式打开,即 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()  # 关闭文件

b. 另一种则是今天的主角,通过 Python 第三方包(chardet)帮助我们检测文件的编码格式,然后再按正常模式读取文件,方法如下:

注意,由于在测试时发现,文件内容过少时,检测结果有较大偏差(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”等,经过测试发现,这个参数并不是所有文件都能被检测出来

此时,我们就可以按照检测得到的结果,按照已知文件格式的情况,查看文件内容即可。

c. 还有另一种检测文件格式的方法,就是使用 bs4 库的 UnicodeDammit 方法。

from bs4 import UnicodeDammit
dammit = UnicodeDammit("Sacr\xc3\xa9 bleu!")
print(dammit.unicode_markup)    # Sacré bleu!
dammit.original_encoding    # 'utf-8'

同样,字符越多,检测结果越精确,如果事先猜测到一些可能编码,那么可以将猜测的编码作为参数,这样将优先检测这些编码:

dammit = UnicodeDammit("Sacr\xe9 bleu!", ["latin-1", "iso-8859-1"])
print(dammit.unicode_markup)    # Sacré bleu!
dammit.original_encoding    # 'latin-1'

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值