使用chardet判断编码方式
1. chardet是什么
chardet是python中比较常用的一个编码方式检测库,需要注意的是它只检测并返回检测结果,并不负责对原数据做什么处理。
可以使用PIP命令安装:
pip install chardet
2. 如何使用
2.1 API简介
一般都是调用chardet.detect传入一个字节数组,返回一个字典,此字典中存放分析的结果,一个可能的分析结果字典:
{'encoding': 'ISO-8859-1','confidence': 0.44923076923076927,'language': ''
}
encoding: 可能的编码方式
condidence: 识别的正确率是多少,这是一个区间[0, 1]上的值,值越大表示结果越可信
language: 字节码中存放的可能会是什么语言
2.2 读取配置文件时自动识别编码方式
只要是一个灵活的软件都会提供配置文件来让用户根据自己需要进行定制,但是我们没法保证用户究竟是使用什么鬼东西来编辑这个配置文件的,vim?notepad?editplus?奇奇怪怪的文本编辑工具一大堆,如果强制配置文件只能使用UTF-8格式的甚至还可能会碰上notepad的bom,要了命了,所以一个比较好的方式是在读取配置文件的时候能够自动检测它的编码方式,这样就无需关心用户究竟是使用什么鬼东西编辑的。一个可能的例子如下:
#! /usr/bin/pythonimport chardet
import jsonclass EncodingUtil:"""编码工具类"""@staticmethoddef decode(content):"""读取字节数组为字符串:param content: a byte array:return:"""encoding = chardet.detect(content)['encoding']return content.decode(encoding)class ConfigurationLoader:"""配置文件加载类"""@staticmethoddef load_config(config_path):with open(config_path, 'rb') as config_file:config_content = EncodingUtil.decode(config_file.read())return json.loads(config_content)if __name__ == '__main__':print(ConfigurationLoader.load_config('D:/config.json'))
2.3 爬虫中用来判别网页的编码方式
呃,貌似现在python已经成为爬虫的代名词,正常的套路网站内容都是按照UTF-8编码返回的,但是总有一些非主流站,会以奇奇怪怪的编码返回(根据笔者的经验,国内的网站一般也就是UTF-8和GB2312的,GB2312估计是因为很多编写网页的开发工具默认是GB2312的,写网页的家伙没改然后就这样子了呗),如果是有针对性的爬虫(时髦的说法叫做垂直领域爬虫),大不了我们失败几次之后专门做下编码格式转换就可以了,毕竟写爬虫基本就是不断处理异常情况,但是如果写的是通用爬虫,我们甚至都不知道爬虫会去哪里抓取内容更别提内容的编码方式了,所以在这种情况下在处理内容之前要进行一个编码转换,将其转换为宇宙通用的UTF-8格式,一个简单的例子如下:
#! /usr/bin/pythonimport chardet
import urllib3class Spider:"""蜘蛛侠,爬爬爬"""pool_manager = urllib3.PoolManager()@staticmethoddef get(url):return Spider.pool_manager.urlopen('GET', url)class EncodingUtil:"""编码工具类"""@staticmethoddef decode(content):"""读取字节数组为字符串:param content: a byte array:return:"""encoding = chardet.detect(content)['encoding']return content.decode(encoding)if __name__ == '__main__':# UTF8格式编码的response = Spider.get('http://www.baidu.com/')html = EncodingUtil.decode(response.data)print(html)# GB2312格式编码的,找了好久才找到一个GB2312编码的...response = Spider.get('http://www.hzsjwjcj.gov.cn/')html = EncodingUtil.decode(response.data)print(html)
当正确读取到内容之后就可以传给bs处理啦,chardet在爬虫中的应用大致就是这样子。
2.4 检测大文件
检测编码方式是需要一定的数据量作为参考的,当要检测一个特别大的文件的时候,比如一个几个G大的文件,没必要全部输入太浪费了,但是究竟给它多少数据做检测比较合适呢,1M?10M?100M?这个还真不知道....
所以这个时候我们就可能需要它提供一种方式,我们一点一点的把数据喂给它,当能够确定编码方式的时候就立即返回。哈,它确实提供了这么一种方式:
#! /usr/bin/pythonimport chardet
from chardet.universaldetector import UniversalDetectorclass EncodeUtil:"""编码工具类"""@staticmethoddef detect_big_file(file_path, block_size=1000):"""用于检测大文件的编码方式:param file_path: str,要检测文件的路径:param block_size: 每次读取的块大小:return:"""detector = UniversalDetector()with open(file_path, 'rb') as big_file:block = big_file.read(block_size)while block and not detector.done:detector.feed(block)block = big_file.read(block_size)detector.close()return detector.resultif __name__ == '__main__':print(EncodeUtil.detect_big_file('D:/foo.txt', 1024))
网上流传的版本都是每次读取一行,但是这种方式对于整个大文件只有一行或者是每一行都巨长的情况下直接就歇菜了,所以一个比较好的方式是将每次能够读取的长度把握一下。
通过上面的实验我们也可以总结出来,检测的数据量越少结果就越可能产生偏差,输入的数据量越大结果就可能越正确,所以也明确了chardet的应用场景,当只有几个字节的时候就别指望chardet能给出多正确的结果了。
3. 需要注意的一些坑
如果看到检测的返回值是这个样子的:
{'encoding': 'ascii','confidence': 1.0,'language': ''
}
不要急着感叹于chardet的牛叉竟然可以100%的确定是ASCII编码,这个八成就是没有检测出来,因为chardet.detect方法的默认返回值就是这个,贴源代码有图有真相:
# Default to ASCII if it is all we've seen so far
elif self._input_state == InputState.PURE_ASCII:self.result = {'encoding': 'ascii','confidence': 1.0,'language': ''}
参考资料:
1. https://pypi.python.org/pypi/chardet/
2. https://github.com/chardet/chardet
转载于:https://www.cnblogs.com/cc11001100/p/7630279.html
使用chardet判断编码方式相关推荐
- python 文件编码的识别_【python】python编码方式,chardet编码识别库
环境: python3.6 需求: 针对于打开一个文件,可以读取到文本的编码方式,根据默认的文件编码方式来获取文件,就不会出现乱码. 针对这种需求,python中有这个方式可以很好的解决: 解决策略: ...
- 判断一段文件是UTF-8编码还是GB2312的编码方式
分类: 算法 cpp2012-03-10 16:01 7120人阅读 评论(2) 收藏 举报 null生活c 对于只包含中文和英文的文本中判断编码方式是非常简单的,中文的编码方式最常用的是GBK,字符 ...
- python查看字符串编码方式_Python字符编码判断方法分析
本文实例讲述了Python字符编码判断方法.分享给大家供大家参考,具体如下: 方法一: isinstance(s, str) 用来判断是否为一般字符串 isinstance(s, unicode) 用 ...
- 【delphi】判断文件的编码方式(ANSI、Unicode、UTF8、UnicodeBIG)
在开发中,经常会碰到文件编码格式不正确,有时也需要进行编码转换,具体的编码原理可以自行查找,这里记录下我的处理方式.根据这个原理稍加修改即可实现编码转换和自动判断. {判断文件的编码方式,可以实现编码 ...
- wpf esc key 检测不到_爬虫笔记之requests检测网站编码方式(zozo.jp)(碎碎念) - CC11001100...
发现有些网站的编码方式比较特殊,使用requests直接请求拿是得不到正确的文本的,比如这个网站: 当使用requests访问网站,使用方式取响应文本的时候,会发现得到的是奇怪的内容: #!/usr/ ...
- chardet判断中文编码
res.text判断中文编码时有时候会出错,还是自己通过chardet获取更准确 先看一段代码 import requestsr = requests.get('http://epaper.sxrb. ...
- java 读取流的字符编码格式_如何使用Java代码获取文件、文件流或字符串的编码方式...
标签: 今天通过网络资源研究了一下如何使用Java代码获取文件.文件流或字符串的编码方式,现将代码与大家分享: package com.ghj.packageoftool; import info.m ...
- FPGA之道(56)状态的编码方式
文章目录 前言 状态的编码方式 binary one-hot gray johnson auto compact sequential user speed none safe mode 前言 据我说 ...
- protocol buffer的高效编码方式
文章目录 简介 定义一个简单的message Base 128 Varints 消息体的结构 符号整数 字符串 嵌套的消息 总结 简介 protocol buffer这种优秀的编码方式,究竟底层是怎么 ...
最新文章
- (function() {})();和(function(){}())
- Android 4 +https(如何启动TLS1 1 and TLS1 2)
- Python编程之数据结构与算法练习_004
- HTML5 API详解(16):web socket 全双工通信
- Vue中基于Vuex使用echarts组件动态数据绑定的方法
- Android开发笔记(一百五十一)WebView与JavaScript交互的四种形式
- [bzoj1552][Cerc2007]robotic sort[bzoj3506][Cqoi2014]排序机械臂
- postgresql 集合类型_PostgreSQL数据类型-时间数据类型
- ios懒人笔记应用源码
- CSDN写博客怎么插入数学公式(干货满满呦)
- 敏捷开发 角色英文简称
- 公共关系与人际交往能力
- hive为什么总是 执行Job running in-process (local Hadoop),总是本地执行。
- 本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
- 使用Seam-gen生成基础项目骨架
- TADF的发展史前景概念,热活化延迟荧光(TADF)材料的未来发展
- 微信公众号新上线“快捷私信”功能 微信留言功能没有的号迎来转机
- 分布式高并发服务三种常用限流方案简介
- 转:条件型 CORS 响应下因缺失 Vary: Origin 导致的缓存错乱问题
- 谈task_struct
热门文章
- 安装完python后、还需要安装什么-初学 Python 需要安装哪些软件?
- python入门编程软件免费-Python编程干货免费领取!!!
- python处理excel表格实例-通过实例学习Python Excel操作
- python3爬虫入门教程-python3爬虫入门程序
- python在日常工作处理中的应用-python在工作中的应用场景介绍
- python爬虫百科-Python爬虫之requests库介绍(一)
- python可以自学吗-python自学行吗 新手可以自学python吗
- 中国python之父是谁-Python之父重回决策层
- python装饰器实例-Python装饰器简单用法实例小结
- 运行python需要网吗-python搭建网站(想学Python有什么建议吗?)