python办公自动化(一) | chardet库自动读写多编码格式的文件

网友投稿 1082 2022-05-29

对python懵懵懂懂的我们,在使用Python读写文件时一定遇到过UnicodeEncodeError:的错误吧。

往往是,各种编码格式都尝遍了,还是连文件都不能正常读取,让我们的“骚操作”还没展开就歇菜了。

为了解决这稀奇古怪的编码和解码难题,有高人开发出了第三库——chardet,其开发文档中简短地解释道——

Character encoding auto-detection in Python. As smart as your browser. Open source.

开源的Python字符编码自动检测(库),和你的浏览器一样聪明。

本文目录如下——

chardet库说明

字符编码

计算机不会直接处理字符和符号,他们以比特和字节为单位处理所有内容。我们在电脑屏幕上看到的每一段文字都是以一种特殊的字符编码方式存储的。

然而由于现实世界的文化多样性和软件开发的复杂性,有许多不同的字符编码,其中一些针对特定语言(如俄语、汉语或英语)进行了优化,另一些则可用于多种语言。

字符编码(character encoding)提供了我们在屏幕上看到的东西和计算机可以直接读取的内容之间的映射。[1]

chardet原理

数据猿觉得chardet的名字取自英文Character detcter,即字符探测者。

因为同一种编码具有类似的编码规律,所以可以计算机可以通过语言规律检测到编码格式。chardet就是其中的产物,它意味着采用未知字符编码的字节序列,并尝试确定编码,以便读取文本。这就像在没有解密钥匙的情况下破解一个密码。

目前chardet可以自动识别的编码格式——

ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)

Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese)

EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese)

EUC-KR, ISO-2022-KR (Korean)

KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic)

ISO-8859-5, windows-1251 (Bulgarian)

ISO-8859-1, windows-1252 (Western European languages)

ISO-8859-7, windows-1253 (Greek)

ISO-8859-8, windows-1255 (Visual and Logical Hebrew)

TIS-620 (Thai)

命令行中pip安装:

pip install chardet

应用案例

识别网页编码格式

尝试一下识别熊猫TV

from urllib import * rawdata = urllib.request.urlopen('http://ipanda.com.de/').read() import chardet chardet.detect(rawdata)

{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

识别python的官方文档

以上两个都是国际通用语言,所以没有识别到专属语言,很遗憾。

识别txt文件编码格式

数据猿这里为大家编写一款通用的txt文件编码检测并读取的函数。

核心代码就是chardet识别出txt文件编码格式,然后以此识别结果来解码。就可以全程无报错读取txt文档了。

import chardet txt = input('请输入您要转换的txt文件名:') def read_txt_without_decode(txt): try: with open(txt+'.txt','rb') as f: pre_string = f.read() f_charInfo = chardet.detect(pre_string) #print(f_charInfo) # 输出文本格式信息 print('此文本的编码方式为:',f_charInfo['encoding']) # 取得文本格式 string = pre_string.decode(f_charInfo['encoding']) # 通过取得的文本格式读取txt except: print('恭喜你遇到了未知错误,联系文科数据员debug吧')

代码运行过程——

输入想要读取的txt文件名

进入 read_txt_without_decode函数,并进入try...except语句。

with语句读取文本而暂不解码储存字符,chardet先识别文本编码格式

根据识别的文本编码格式解码

退出try...except语句.

经过试验,数据猿发现这个函数很稳定,迄今为止还没有bug出现。

自动识别txt编码格式并自动存储

自动读了,那可以自动存就更好了。

对上述代码进行改良——

with语句写入文本文件,编码格式采用识别到的编码格式。

使用format来进行字符串和变量的交互显示

with open('ed_'+txt+'.txt', 'w', encoding='{}'.format(f_charInfo['encoding'])) as n: # 设置文件对象 n.write(string) # 将字符串写入文件中 print('已经完成写入,文件名为{}'.format('ed_'+txt+'.txt'))

效果如下——

小结

今日本篇的题目是自动化办公,因为同时具备了python最简单的自动化要素——

自定义函数

报错定位与忽略,如try...except

自动化文件读取、写入和命名,如chardet自动化编码格式,format字符串交互

这些都有明显的的自动化办公的功能。后续,数据猿将逐步拓展这类知识。可以通过python高效办公,文科生驰骋文山会海不是梦!

可公主号后台回复

chardet

获取.py文件

往期经典文章:

文科数据员公众号历史记录 | 2020年2月-5月

更多内容,欢迎私戳!

参考资料:

[1]pypi上的chardet官方文档:

https://chardet.readthedocs.io/en/latest/faq.html#isnt-that-impossible

文字编辑:数据猿Riggle

python办公自动化(一) | chardet库自动读写多编码格式的文件

在读新闻与传播专硕研究生,写论文、找工作ing

首发平台:文科数据员(ID: HSS_data)

Python 自动化测试

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:电子签名与手写签名的区别,优势是什么?
下一篇:接口测试 --apipost 如何自定义变量
相关文章