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 相关文章推荐
在win和Linux系统中python命令行运行的不同
Jul 03 Python
Django自定义分页效果
Jun 27 Python
只需7行Python代码玩转微信自动聊天
Jan 27 Python
Python Web版语音合成实例详解
Jul 16 Python
pycharm重命名文件的方法步骤
Jul 29 Python
详解numpy.meshgrid()方法使用
Aug 01 Python
python文字转语音实现过程解析
Nov 12 Python
使用python快速在局域网内搭建http传输文件服务的方法
Nov 14 Python
Python读取Excel数据并生成图表过程解析
Jun 18 Python
Keras预训练的ImageNet模型实现分类操作
Jul 07 Python
Python3爬虫中Ajax的用法
Jul 10 Python
Python+OpenCV图像处理——图像二值化的实现
Oct 24 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之PHP语法学习笔记1
2006/12/17 PHP
介绍php设计模式中的工厂模式
2008/06/12 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
2013/09/28 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
Js 本页面传值实现代码
2009/05/17 Javascript
javaScript同意等待代码实现心得
2011/01/01 Javascript
jQuery中实现动画效果的基本操作介绍
2013/04/16 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
[01:04:49]KG vs LGD 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
浅谈python 四种数值类型(int,long,float,complex)
2016/06/08 Python
Python之reload流程实例代码解析
2018/01/29 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
2018/05/31 Python
python中的for循环
2018/09/28 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
python中的错误如何查看
2020/07/08 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
教师实习自我鉴定
2013/12/13 职场文书
网络编辑求职信
2014/04/30 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
使用Django实现商城验证码模块的方法
2021/06/01 Python
快速学习Oracle触发器和游标
2021/06/30 Oracle