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

举报
文科数据员 发表于 2021/03/10 22:07:20 2021/03/10
【摘要】 使用chardet库,实现对网页编码的快速识别,对txt文本编码格式的快速识别和批量修改。

对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文件



往期经典文章:

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

更多内容,欢迎私戳!

参考资料:

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

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

文字编辑:数据猿Riggle

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。