说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
chardet 是一个开源 的 Python 字符编码自动检测三方库,可以和你的浏览器一样,自动识别字符的编码格式。他的使用场景,是帮助我们识别一些编码格式不明确的文本字符,以辅助我们有效地进行解码识别字符。
Python 提供了 str 和 bytes 两种数据类型,但它们之间的编码格式一直让人头疼。 我们知道文本的传输会经历编码、传输、解码的过程。在这个过程中,传递和接收方应该约定字符的编码格式,利用 encode() 和 decode() 来进行编码和解码的操作。这个过程如下:
如果不知道商品第一步的编码类型,我们就无法进行第二步的操作, 这时候我们就只能靠猜了。猜测的方法就是先收集部分的字符特征,然后根据这些特征进行一定的猜测,猜测过程大概率能够得到正确的编码类型。但是这个猜测过程是十分繁琐,费时又费力,这时候这个三方库 chardet 正好来解决这方面的问题, 用它来检测编码,即简单又易用。
首先在终端进行安装:
pip install chardet
给定一个字节串 bytes 进行检测:
import chardet
# 编码是 ascii 概率是1.0(即100%)
chardet.detect(b'gairuo.com')
# {'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
对中文编码后再进行编码测试:
data = '我是中国人'.encode('gbk')
# GB2312 是 gbk 超集,概率 74%, 语言为中文
chardet.detect(data)
# {'encoding': 'GB2312', 'confidence': 0.7407407, 'language': 'Chinese'}
data = '我是中国人'.encode('utf-8')
# 正确检测到
chardet.detect(data)
# {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
一个典型的场景,我们爬取到一份数据,但不知道编码,可以用它进行检测:
import requests # 需要安装
rawdata = requests.get('http://yahoo.co.jp/').content
import chardet
chardet.detect(rawdata)
# {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
打开文件时不知道编码,进行检测:
with open('202110-test-01.ipynb', 'rb') as f:
code = chardet.detect(f.read())
print(code)
# {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
检测给定字节字符串的所有可能的编码:
data = '66顺'.encode('utf-8')
chardet.detect_all(data)
'''
[{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''},
{'encoding': 'utf-8', 'confidence': 0.505, 'language': ''}]
'''
要使用结果就取返回字典的 encoding 值。
如果要检测多个文本(例如单独文件)的编码,可以重复使用单个 UniversalDetector 对象。只需在每个文件的开头调用 detector.reset() ,多次调用 detector.feed,然后调用detector.close() 并检查detector.result 字典中的文件结果。
import urllib.request
from chardet.universaldetector import UniversalDetector
usock = urllib.request.urlopen('http://yahoo.co.jp/')
detector = UniversalDetector()
for line in usock.readlines():
detector.feed(line)
if detector.done: break
detector.close()
usock.close()
print(detector.result)
# {'encoding': 'EUC-JP', 'confidence': 0.99}
import glob
from chardet.universaldetector import UniversalDetector
detector = UniversalDetector()
for filename in glob.glob('*.xml'):
print(filename.ljust(60), end='')
detector.reset()
for line in open(filename, 'rb'):
detector.feed(line)
if detector.done: break
detector.close()
print(detector.result)
通用编码检测器目前支持二十多种字符编码。
可检测中文、日文、韩文等多种语言。
在读取数据过程中,遇到 csv 等文件中文如果不是 utf-8 编码,可试用 gbk,或者更多的字符集 GB2312、Big5、GB18030
更新时间:2023-04-20 09:26:27 标签:python 编码 字符