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实现的ini文件操作类分享
Nov 20 Python
编写Python的web框架中的Model的教程
Apr 29 Python
用Python写一个无界面的2048小游戏
May 24 Python
python 设置文件编码格式的实现方法
Dec 21 Python
python使用itchat实现手机控制电脑
Feb 22 Python
使用Python更换外网IP的方法
Jul 09 Python
win8下python3.4安装和环境配置图文教程
Jul 31 Python
使用python进行广告点击率的预测的实现
Jul 04 Python
Python使用pycharm导入pymysql教程
Sep 16 Python
python 实现音频叠加的示例
Oct 29 Python
python 如何上传包到pypi
Dec 24 Python
python爬虫用request库处理cookie的实例讲解
Feb 20 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
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
PHP利用DWZ.CN服务生成短网址
2019/08/11 PHP
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
jQuery插件pagination实现无刷新分页
2016/05/21 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
深入理解Vuex 模块化(module)
2017/09/26 Javascript
Vue 进入/离开动画效果
2017/12/26 Javascript
使用vue制作探探滑动堆叠组件的实例代码
2018/03/07 Javascript
使用JS代码实现俄罗斯方块游戏
2018/08/03 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
浅谈小程序 setData学问多
2019/02/20 Javascript
小程序云开发实现数据库异步操作同步化
2019/05/18 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
wxpython学习笔记(推荐查看)
2014/06/09 Python
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
对python操作kafka写入json数据的简单demo分享
2018/12/27 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
详解python的变量缓存机制
2021/01/24 Python
优秀教师的感人事迹
2014/02/04 职场文书
应届大学生求职信
2014/07/20 职场文书
食品安全承诺书范文
2014/08/29 职场文书
个人四风问题对照检查材料
2014/09/26 职场文书
预备党员2014年第四季度思想汇报范文
2014/10/25 职场文书
学生个人评语大全
2015/01/04 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
springboot临时文件存储目录配置方式
2021/07/01 Java/Android
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python