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生成器generator用法实例分析
Jun 04 Python
Python实现字典的遍历与排序功能示例
Dec 23 Python
Python使用分布式锁的代码演示示例
Jul 30 Python
python pandas读取csv后,获取列标签的方法
Nov 12 Python
Python进程间通信Queue消息队列用法分析
May 22 Python
python 猴子补丁(monkey patch)
Jun 26 Python
python变量的存储原理详解
Jul 10 Python
python搜索包的路径的实现方法
Jul 19 Python
解决django 新增加用户信息出现错误的问题
Jul 28 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
Python配置pip国内镜像源的实现
Aug 20 Python
Django搭建项目实战与避坑细节详解
Dec 06 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的安全
2006/10/09 PHP
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
php allow_url_include的应用和解释
2010/04/22 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
php使用curl简单抓取远程url的方法
2015/03/13 PHP
php版微信小店调用api示例代码
2016/11/12 PHP
jQuery数组处理代码详解(含实例演示)
2012/02/03 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
javascript 小数乘法结果错误的处理方法
2016/07/28 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/09/29 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
简单理解Python中基于生成器的状态机
2015/04/13 Python
在Python中使用next()方法操作文件的教程
2015/05/24 Python
python图像常规操作
2017/11/11 Python
Flask框架信号用法实例分析
2018/07/24 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
python怎么删除缓存文件
2020/07/19 Python
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
毕业生找工作求职信
2014/08/05 职场文书
领导班子四风表现材料
2014/08/23 职场文书
2014年采购员工作总结
2014/11/18 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python
python3实现常见的排序算法(示例代码)
2021/07/04 Python
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL