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 相关文章推荐
python批量修改文件后缀示例代码分享
Dec 24 Python
Python的Django框架安装全攻略
Jul 15 Python
Python 数据结构之队列的实现
Jan 22 Python
Python面向对象之继承代码详解
Jan 29 Python
Python爬虫实现全国失信被执行人名单查询功能示例
May 03 Python
Tensorflow使用tfrecord输入数据格式
Jun 19 Python
python对视频画框标记后保存的方法
Dec 07 Python
对python使用telnet实现弱密码登录的方法详解
Jan 26 Python
Django框架获取form表单数据方式总结
Apr 22 Python
你需要学会的8个Python列表技巧
Jun 24 Python
Django DRF认证组件流程实现原理详解
Aug 17 Python
python用700行代码实现http客户端
Jan 14 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
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
php中addslashes函数与sql防注入
2014/11/17 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
javascript instanceof,typeof的区别
2010/03/24 Javascript
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
详解微信小程序实现WebSocket心跳重连
2018/07/31 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
监听element-ui table滚动事件的方法
2019/03/26 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
解决layer.prompt无效的问题
2019/09/24 Javascript
Python从零开始创建区块链
2018/03/06 Python
python进行文件对比的方法
2018/12/24 Python
pandas去除重复列的实现方法
2019/01/29 Python
Python Subprocess模块原理及实例
2019/08/26 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
pytorch:model.train和model.eval用法及区别详解
2020/02/20 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
深入了解Python 方法之类方法 &amp; 静态方法
2020/08/17 Python
python3中确保枚举值代码分析
2020/12/02 Python
开会迟到检讨书
2014/01/08 职场文书
尽职尽责村干部自我鉴定
2014/01/23 职场文书
高中生第一学年自我鉴定2015
2014/09/28 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
2015年营业员工作总结
2015/04/23 职场文书
创业计划书之面包店
2019/09/17 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书