python办公自动化(一) | chardet库自动读写多编码格式的文件
对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)
chardet安装方法
命令行中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文件
往期经典文章:
更多内容,欢迎私戳!
参考资料:
[1]pypi上的chardet官方文档:
https://chardet.readthedocs.io/en/latest/faq.html#isnt-that-impossible
文字编辑:数据猿Riggle
在读新闻与传播专硕研究生,写论文、找工作ing
首发平台:文科数据员(ID: HSS_data)
- 点赞
- 收藏
- 关注作者
评论(0)