Python 转换文本编码实现解析


Posted in Python onAugust 27, 2019

最近在做周报的时候,需要把csv文本中的数据提取出来制作表格后生产图表。

在获取csv文本内容的时候,基本上都是用with open(filename, encoding ='UTF-8') as f:来打开csv文本,但是实际使用过程中发现有些csv文本并不是utf-8格式,从而导致程序在run的过程中报错,每次都需要手动去把该文本文件的编码格式修改成utf-8,再次来run该程序,所以想说:直接在程序中判断并修改文本编码。

基本思路:先查找该文本是否是utf-8的编码,如果不是则修改为utf-8编码的文本,然后再处理。

python有chardet库可以查看到文本的encoding信息:

detect函数只需要一个 非unicode字符串参数,返回一个字典(例如:{'encoding': 'utf-8', 'confidence': 0.99})。该字典包括判断到的编码格式及判断的置信度。

import chardet
def get_encode_info(file):
  with open(file, 'rb') as f:
    return chardet.detect(f.read())['encoding']

不过这个在从处理小文件的时候性能还行,如果文本稍微过大就很慢了,目前我本地的csv文件是近200k,就能明显感觉到速度过慢了,效率低下。不过chardet库中提供UniversalDetector对象来处理:创建UniversalDetector对象,然后对每个文本块重复调用其feed方法。如果检测器达到了最小置信阈值,它就会将detector.done设置为True。

一旦您用完了源文本,请调用detector.close(),这将完成一些最后的计算,以防检测器之前没有达到其最小置信阈值。结果将是一个字典,其中包含自动检测的字符编码和置信度(与charde.test函数返回的相同)。

from chardet.universaldetector import UniversalDetector
def get_encode_info(file):
 with open(file, 'rb') as f:
    detector = UniversalDetector()
 for line in f.readlines():
      detector.feed(line)
 if detector.done:
 break
    detector.close()
 return detector.result['encoding']

在做编码转换的时候遇到问题:UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 178365: character maps to <undefined>

def read_file(file):
 with open(file, 'rb') as f:
 return f.read()
def write_file(content, file):
 with open(file, 'wb') as f:
    f.write(content)
def convert_encode2utf8(file, original_encode, des_encode):
  file_content = read_file(file)
  file_decode = file_content.decode(original_encode)  #-->此处有问题
  file_encode = file_decode.encode(des_encode)
  write_file(file_encode, file)

这是由于byte字符组没解码好,要加另外一个参数errors。官方文档中写道:

bytearray.decode(encoding=”utf-8”, errors=”strict”)

Return a string decoded from the given bytes. Default encoding is 'utf-8'. errors may be given to set a different error handling scheme. The default for errors is 'strict', meaning that encoding errors raise a UnicodeError. Other possible values are 'ignore', 'replace' and any other name registered via codecs.register_error(), see section Error Handlers. For a list of possible encodings, see section Standard Encodings.

意思就是字符数组解码成一个utf-8的字符串,可能被设置成不同的处理方案,默认是‘严格'的,有可能抛出UnicodeError,可以改成‘ignore','replace'就能解决。

所以将此行代码file_decode = file_content.decode(original_encode)修改成file_decode = file_content.decode(original_encode,'ignore')即可。

完整代码:

from chardet.universaldetector import UniversalDetector

def get_encode_info(file):
 with open(file, 'rb') as f:
   detector = UniversalDetector()
   for line in f.readlines():
     detector.feed(line)
     if detector.done:
       break
   detector.close()
   return detector.result['encoding']

def read_file(file):
  with open(file, 'rb') as f:
    return f.read()

def write_file(content, file):
  with open(file, 'wb') as f:
    f.write(content)

def convert_encode2utf8(file, original_encode, des_encode):
  file_content = read_file(file)
  file_decode = file_content.decode(original_encode,'ignore')
  file_encode = file_decode.encode(des_encode)
  write_file(file_encode, file)

if __name__ == "__main__":
  filename = r'C:\Users\danvy\Desktop\Automation\testdata\test.csv'
  file_content = read_file(filename)
  encode_info = get_encode_info(filename)
  if encode_info != 'utf-8':
    convert_encode2utf8(filename, encode_info, 'utf-8')
  encode_info = get_encode_info(filename)
  print(encode_info)

参考:https://chardet.readthedocs.io/en/latest/usage.html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
wxpython 学习笔记 第一天
Mar 16 Python
Python对两个有序列表进行合并和排序的例子
Jun 13 Python
用Python编写web API的教程
Apr 30 Python
详解Python验证码识别
Jan 25 Python
Python中getattr函数和hasattr函数作用详解
Jun 14 Python
尝试用最短的Python代码来实现服务器和代理服务器
Jun 23 Python
基于Django的python验证码(实例讲解)
Oct 23 Python
python中强大的format函数实例详解
Dec 05 Python
浅谈Python反射 &amp; 单例模式
Mar 21 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
Apr 25 Python
推荐技术人员一款Python开源库(造数据神器)
Jul 08 Python
python中pandas.read_csv()函数的深入讲解
Mar 29 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 #Python
python定位xpath 节点位置的方法
Aug 27 #Python
python实现截取屏幕保存文件,删除N天前截图的例子
Aug 27 #Python
python自动化UI工具发送QQ消息的实例
Aug 27 #Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
Aug 27 #Python
对Python获取屏幕截图的4种方法详解
Aug 27 #Python
python对常见数据类型的遍历解析
Aug 27 #Python
You might like
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
php.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
php提交post数组参数实例分析
2015/12/17 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
浅谈JavaScript的push(),pop(),concat()方法
2016/06/03 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
2016/10/10 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
微信小程序 slot踩坑的解决
2019/04/01 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
[01:18:45]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第三场2月1日
2021/03/11 DOTA
总结Python编程中三条常用的技巧
2015/05/11 Python
python使用正则表达式提取网页URL的方法
2015/05/26 Python
详解Python编程中包的概念与管理
2015/10/16 Python
python实现QQ批量登录功能
2019/06/19 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
Python实现非正太分布的异常值检测方式
2019/12/09 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
python 读取串口数据的示例
2020/11/09 Python
Python中过滤字符串列表的方法
2020/12/22 Python
HTML5跳转小程序wx-open-launch-weapp的示例代码
2020/07/16 HTML / CSS
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
Tostadora意大利:定制T恤
2019/04/08 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
C++面试题目
2013/06/25 面试题
优秀生推荐信范文
2013/11/28 职场文书
毕业生护理专业个人求职信范文
2014/01/04 职场文书
文秘应聘自荐书范文
2014/02/18 职场文书
企业消防安全责任书
2014/07/23 职场文书
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript