[python] 基于chardet识别字符编码
对于人类能够识别的字符,计算机会根据某一对应关系将其转换为二进制形式进行保存。这个对应关系就是字符编码表,即什么样的字符对应什么样的二进制编码。这种字符编码表往往是多种多样的,因此,如果我们想要将一个未知编码的二进制文件转换为可读文本进行显示,就需要考其使用的是什么类型的字符编码。关于字符编码的进一步介绍见文章字符集和字符编码。
现实中,往往根据各种字符编码的特征字符来猜测当前文件使用的是什么类型的字符编码。但是许多字符对于不同字符编码是通用的,区别在于每种编码可能使用不同的字节序列来存储同一字符,根据这一特性再进一步处理。在Python中,chardet库能够提供了实现字符编码自动检测的函数。chardet支持绝大部分常见字符编码的识别,其官方仓库见:chardet。chardet安装指令如下:
pip install chardet
1 使用
基础使用
chardet提供detect函数接口实现字符编码的自动检测。detect函数接受一个参数,即非Unicode字符串。它返回一个字典,其中包含自动检测到的字符编码和范围为0到1的置信度,还有语言类型。
# 导入库
import urllib.request
import chardet
# 读取网站
rawdata = urllib.request.urlopen('http://baidu.com/').read()
# 可以看到使用的是ascii编码
chardet.detect(rawdata)
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
# 读取网站
rawdata = urllib.request.urlopen('http://en.people.cn/').read()
# 可以看到使用的是utf-8编码
chardet.detect(rawdata)
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
# 创建utf-8字节类型数据
data = bytes('hello, world', encoding='utf-8')
print(data)
chardet.detect(data)
b'hello, world'
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
# bytes类型可以直接通过python的decode函数进行解码
data.decode('ascii')
'hello, world'
# 创建utf-8字节类型数据,这里可以看到utf-8是最高效的编码方式。
data = bytes('hello, world!你好世界!', encoding='utf-8')
print(data)
chardet.detect(data)
b'hello, world!\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c\xef\xbc\x81'
{'encoding': 'utf-8', 'confidence': 0.9690625, 'language': ''}
# bytes类型可以直接通过python的decode函数进行解码
data.decode('utf-8')
'hello, world!你好世界!'
data = bytes('你好世界', encoding='GBK')
# 识别可能错误
chardet.detect(data)
{'encoding': None, 'confidence': 0.0, 'language': None}
# 需要更丰富的字符数据提高识别率
data = bytes('你好世界,你好', encoding='GBK')
chardet.detect(data)
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
大量文本识别
如果您正在处理大量文本,您可以调用UniversalDetector,以加快识别速度。下面的代码首先创建一个UniversalDetector对象,然后对大型文本分块识别,每个文本块用其检测方法feed。如果检测器达到最小置信阈值,它将设置detector.done为True,进而输出当前文本的字符编码。
import urllib.request
from chardet.universaldetector import UniversalDetector
usock = urllib.request.urlopen('http://baidu.com/')
detector = UniversalDetector()
for line in usock.readlines():
detector.feed(line)
if detector.done: break
detector.close()
usock.close()
print(detector.result)
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
对于多个文件或多个字符串,也可以使用UniversalDetector加快识别速度。
from chardet.universaldetector import UniversalDetector
texta = bytes('hello, world', encoding='utf-8')
textb = bytes('你好世界,你好', encoding='GBK')
detector = UniversalDetector()
for data in [texta,textb]:
# 检测器重置
detector.reset()
detector.feed(data)
if detector.done: break
detector.close()
print(detector.result)
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
UnicodeDammit的使用
UnicodeDammit是beautifulsoup的内置库, 用于猜测字符编码。在UnicodeDammit中集成了chardet模块使得我们可以快速获取字符编码。
from bs4 import UnicodeDammit
data = bytes('你好世界,你好', encoding='GBK')
dammit = UnicodeDammit(data)
# 解码结果
print(dammit.unicode_markup)
# 打印编码结果
print(dammit.original_encoding)
# 或直接调用chardet
print(dammit.detector.chardet_encoding)
你好世界,你好
gb2312
GB2312
2 参考
[python] 基于chardet识别字符编码的更多相关文章
- python之旅:字符编码
一 了解字符编码的知识储备 一 计算机基础知识 知识储备:cpu.内存.硬盘 二 文本编辑器存取文件的原理(nodepad++,pycharm,word) #1.打开编辑器就打开了启动了一个进程,是在 ...
- 用chardet判断字符编码的方法
转自http://www.cnblogs.com/xiaowuyi/archive/2012/03/09/2387173.html 用chardet判断字符编码的方法 1.chardet下载与安装 ...
- python基础——6(字符编码,文件操作)
今日内容: 1.字符编码: 人识别的语言与机器识别的语言转化的媒介 ***** 2.字符与字节: 字符占多少字节,字符串转化 *** 3.文件操作: 操作硬盘中的一块区域:读写操作 ...
- python文件操作:字符编码与文件处理
一.字符编码 二.文件处理 一.字符编码 储备知识点: 1. 计算机系统分为三层: 应用程序 操作系统 计算机硬件 2. 运行python程序的三个步骤 1. 先启动python解释器 2. 再将py ...
- python文件操作与字符编码
知识内容: 1.文件对象与文件处理流程 2.基本操作 3.上下文管理 4.文件的修改与文件内光标的移动 5.字符编码 一.文件对象与文件处理流程 1.文件对象 (1)文件分类 按文件中数据的组织形式可 ...
- python(10)- 字符编码
一 什么是编码? 基本概念很简单.首先,我们从一段信息即消息说起,消息以人类可以理解.易懂的表示存在.我打算将这种表示称为“明文”(plain text).对于说英语的人,纸张上打印的或屏幕上显示的英 ...
- python(4)- 字符编码
一 什么是编码? 基本概念很简单.首先,我们从一段信息即消息说起,消息以人类可以理解.易懂的表示存在.我打算将这种表示称为“明文”(plain text).对于说英语的人,纸张上打印的或屏幕上显示的英 ...
- 小白的Python之路 day1 字符编码
字符编码 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill) ASCII(American Standard Code for Information Interc ...
- Python 入门基础6 --字符编码、文件操作1
今日内容: 1.字符编码 2.字符与字节 3.文件操作 一.字符编码 了解: cpu:将数据渲染给用户 内存:临时存放数据,断电消失 硬盘:永久存放数据,断电后不消失 1.1 什么是编码? 人类能够识 ...
随机推荐
- 检测 MySQL 服务是否存活 shell脚本
#!/bin/bash # 检测 MySQL 服务是否存活 # host 为你需要检测的 MySQL 主机的 IP 地址,user 为 MySQL 账户名,passwd 为密码 # 这些信息需要根据实 ...
- Qt Quick 用cmake怎么玩子项目
以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/o-_aGqreuQda-ZmKktvxwA 以往在公司开发众多的项目中 ...
- Python学习三天计划-1
一.第一个Python程序 配置好环境变量后 打开CMD(命令提示符)程序,输入Python并回车 然后,在里面输入代码回车即可立即执行 Python解释器的作用是 将Python代码翻译成计算机认识 ...
- 齐博x1第三季《模板风格的制作》系列009-自定义区块代码
本节来说明如何自定义区块代码,不再继承上层模板,实现个性模板 上一节因为我们继承了layout布局模版,所以我们自定义的代码就无效了 如果我们继承了上层模板,那么相当于我们复制了一份上层模板的结构,也 ...
- Oracle数据库PLSQL编程和存储过程
一.PLSQL编程 1.1.使用PLSQL实现 Hello world! 1 -- Created on 2022/8/22 by ADMINISTRATOR 2 declare 3 -- 这是申明变 ...
- Linux的挖矿木马病毒清除(kswapd0进程)
1.top查看资源使用情况 看到这些进程一直在变化,但是,主要是由于kswapd0进程在作怪,占据了99%以上的CUP,查找资料后,发现它就是挖矿进程 2.排查kswapd0进程 执行命令netsta ...
- 一键部署haproxy脚本
HAPROXY_VERSION=2.6.6 HAPROXY_FILE=haproxy-${HAPROXY_VERSION}.tar.gz #HAPROXY_FILE=haproxy-2.2.12.ta ...
- 达梦-DBLINK数据库链接
aliases: [达梦 DBlink] tags: [数据库,DM,Blog] link: date: 2022-09-06 说明:DM-Oracle指的是在DM中创建链接至Oracle的Dblin ...
- AI音乐创作,让每一个人都成为音乐家
从录音带.MP3到专业的耳机.音箱,随着音乐消费方式的不断升级,音乐创作的专业"门槛"也在AI技术的加持下逐渐大众化,创作者的创新设计.创作频率也在持续增强,能降低创作门槛且智能化 ...
- gcc和g++,c和cpp
gcc对.c文件当成c处理,把.cpp文件当成c++处理 g++对.c和.cpp都当成c++处理 小心会遇到错误