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中使用ConfigParser解析ini配置文件实例
Aug 30 Python
使用PDB模式调试Python程序介绍
Apr 05 Python
python集合用法实例分析
May 30 Python
go和python变量赋值遇到的一个问题
Aug 31 Python
django数据库自动重连的方法实例
Jul 21 Python
Django3.0 异步通信初体验(小结)
Dec 04 Python
numpy ndarray 取出满足特定条件的某些行实例
Dec 05 Python
python 实现二维字典的键值合并等函数
Dec 06 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
Mar 28 Python
Django 5种类型Session使用方法解析
Apr 29 Python
Python操作dict时避免出现KeyError的几种解决方法
Sep 20 Python
发工资啦!教你用Python实现邮箱自动群发工资条
May 10 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
自己动手,丰衣足食 - 短波框形天线制作
2021/03/01 无线电
PHP5/ZendEngine2的改进
2006/10/09 PHP
php抓取页面与代码解析 推荐
2010/07/23 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
laravel 解决多库下的DB::transaction()事务失效问题
2019/10/21 PHP
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
JavaScript动态创建div等元素实例讲解
2016/01/06 Javascript
js+css实现select的美化效果
2016/03/24 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
2016/09/05 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
js实现五星评价功能
2017/03/08 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
vue中的计算属性的使用和vue实例的方法示例
2017/12/04 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
在Python中关于中文编码问题的处理建议
2015/04/08 Python
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
Python Tkinter 简单登录界面的实现
2019/06/14 Python
Python爬虫爬取煎蛋网图片代码实例
2019/12/16 Python
佳能德国网上商店:Canon德国
2017/03/18 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
优秀生推荐信范文
2013/11/28 职场文书
公司活动方案范文
2014/03/06 职场文书
空乘英文求职信
2014/04/13 职场文书
个人授权委托书格式
2014/08/30 职场文书
辞职离别感言
2015/08/04 职场文书
python实现自定义日志的具体方法
2021/05/28 Python