Python编解码问题及文本文件处理方法详解


Posted in Python onJune 20, 2021

编解码器

在字符与字节之间的转换过程称为编解码,Python自带了超过100种编解码器,比如:

  • ascii(英文体系)
  • UTF-8(中文体系)
  • utf-8(全球通用)
  • latin1
  • utf-16

编解码器一般有多个别名,比如utf8、utf-8、U8。

这些编解码器可以传给open()、str.encode()、bytes.decode()等函数的encoding参数。

UnicodeEncodeError

多数非UTF编解码器(比如cp437)只能处理Unicode字符的一小部分子集。把字符转换成字节时,如果目标编码中没有定义这个字符,那么就会抛出UnicodeEncodeError异常。

处理方式一:使用utf8编码。

处理方式二:添加errors参数:

# 忽略 如b'So Paulo'
city.encode("cp437", errors="ignore")
# 替换为? 如b'S?o Paulo'
city.encode("cp437", errors="replace")
# 替换为XML实体 如b'São Paulo'
city.encode("cp437", errors="xmlcharrefreplace")

UnicodeDecodeError

把字节转换为字符时,遇到无法转换的字节时会抛出UnicodeDecodeError异常。这是因为不是每个字节都包含有效的ASCII字符,也不是每个字符都是有效的UTF-8。

处理方式也有两种,跟上面一样。

SyntaxError

Python3默认使用UTF-8编码源码。如果加载的.py模块中包含UTF-8之外的数据,而且没有声明编码,就会抛出SyntaxError异常。

处理方式是在文件顶部添加coding注释:

# coding: cp1252

但是这个办法并不好,最好还是找到这些报错字符,把它们转换为UTF-8。

从网上直接复制代码到IDE中执行经常会报这个错。

处理文本文件

Unicode三明治:

Python编解码问题及文本文件处理方法详解

在程序中尽量少接触二进制,把字节解码为字符,只处理字符串对象。比如在Django中,view应该输出Unicode字符串,Django会负责把响应数据编码成字节序列,而且默认使用UTF-8编码。

Python内置的open函数就是采用了这个原则,在读取文件时会做必要的解码,以文本模式写入文件时会做必要的编码。

文件乱码

Windows更容易遇到这个问题,因为Windows并不是统一的UTF-8编码,比如在Windows10中:

>>> open("cafe.txt", "w", encoding="utf8").write("café")
4
>>> open("cafe.txt").read()
'caf茅'

写入文件时指定了utf8,但是读取文件没有指定,Python就会使用系统默认编码:

>>> import locale
# 打开文件用这个
# 如果没有设置PYTHONENCODING环境变量,sys.stdout/stdin/stderr也用这个
>>> locale.getpreferredencoding()
'cp936'

cp936把最后一个字节解码成了茅而不是é。

>>> import sys
# 二进制数据和字符串之间转换用这个
>>> sys.getdefaultencoding()
'utf-8'
>>> import sys
# 文件名(不是文件内容)用这个
>>> sys.getfilesystemencoding()
'utf-8'

GNU/Linux或Mac OS X不会遇到这个问题,因为多年来它们的默认编码都是UTF-8。

解决办法是一定不能依赖系统默认编码,打开文件时始终应该明确传入encoding=参数,因为不同的设备使用的默认编码可能不同,有时隔一天也会发生变化。

小结

本文介绍了Python的编解码器,以及可能出现的UnicodeEncodeError、UnicodeDecodeError、SyntaxError问题,然后给出了Python的open函数处理文本文件的原则,最后对Windows容易出现的文件乱码问题进行了说明。

到此这篇关于Python编解码问题及文本文件处理方法的文章就介绍到这了,更多相关Python编解码及文本处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
windows下Python实现将pdf文件转化为png格式图片的方法
Jul 21 Python
深入理解Python中的*重复运算符
Oct 28 Python
python的unittest测试类代码实例
Dec 07 Python
python按行读取文件,去掉每行的换行符\n的实例
Apr 19 Python
python 请求服务器的实现代码(http请求和https请求)
May 25 Python
python 字典中取值的两种方法小结
Aug 02 Python
python 反编译exe文件为py文件的实例代码
Jun 27 Python
Python Django 简单分页的实现代码解析
Aug 21 Python
深入了解python中元类的相关知识
Aug 29 Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 Python
python用字节处理文件实例讲解
Apr 13 Python
Python实现简繁体转换
Jun 07 Python
浅谈Python协程asyncio
Jun 20 #Python
Python3接口性能测试实例代码
Jun 20 #Python
使用Djongo模块在Django中使用MongoDB数据库
python自动计算图像数据集的RGB均值
详解如何用Python实现感知器算法
python中24小时制转换为12小时制的方法
Jun 18 #Python
用Python selenium实现淘宝抢单机器人
You might like
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
2019/10/16 PHP
如何在PHP中生成随机数
2020/06/04 PHP
ie 处理 gif动画 的onload 事件的一个 bug
2007/04/12 Javascript
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
Jquery Autocomplete 结合asp.net使用要点
2010/10/29 Javascript
JS实现遮罩层效果的简单实例
2013/11/12 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
Three.js中网格对象MESH的属性与方法详解
2017/09/27 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
在Linux系统上部署Apache+Python+Django+MySQL环境
2015/12/24 Python
不可错过的十本Python好书
2017/07/06 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
中国领先的专业演出票务网:永乐票务
2016/08/29 全球购物
印尼极简主义和实惠的在线家具店:Fabelio
2019/03/27 全球购物
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
销售心得体会
2014/01/02 职场文书
大学生职业生涯规划书前言
2014/01/09 职场文书
副总经理岗位职责
2014/03/16 职场文书
课前一分钟演讲稿
2014/08/26 职场文书
单位租车协议书
2015/01/29 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
毕业生政审意见范文
2015/06/04 职场文书
英雄儿女观后感
2015/06/09 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL
python数字图像处理:图像的绘制
2022/06/28 Python
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python