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 相关文章推荐
Windows下安装python2.7及科学计算套装
Mar 05 Python
Python中利用函数装饰器实现备忘功能
Mar 30 Python
python提取字典key列表的方法
Jul 11 Python
Python编程实现从字典中提取子集的方法分析
Feb 09 Python
pandas使用apply多列生成一列数据的实例
Nov 28 Python
详解python中sort排序使用
Mar 23 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
Jun 17 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
Aug 27 Python
tensorboard实现同时显示训练曲线和测试曲线
Jan 21 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
Dec 15 Python
pycharm 复制代码出现空格的解决方式
Jan 15 Python
Python自然语言处理之切分算法详解
Apr 25 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中strlen和mb_strlen的区别
2014/08/31 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
2020/07/21 PHP
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
JavaScript节点及列表操作实例小结
2015/08/05 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
瀑布流的实现方式(原生js+jquery+css3)
2020/06/28 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
2018/05/08 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
2020/01/22 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
[01:07:53]RNG vs VG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python中常用检测字符串相关函数汇总
2015/04/15 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
Django ORM 常用字段与不常用字段汇总
2019/08/09 Python
Django对models里的objects的使用详解
2019/08/17 Python
python3 配置logging日志类的操作
2020/04/08 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
介绍一下Java的安全机制
2012/06/28 面试题
授权委托书怎么写
2014/04/03 职场文书
质量主管工作职责
2014/09/26 职场文书
德生BCL3000抢先使用感受和评价
2022/04/07 无线电