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 相关文章推荐
Python while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
对pandas replace函数的使用方法小结
May 18 Python
python 实现矩阵上下/左右翻转,转置的示例
Jan 23 Python
使用python读取.text文件特定行的数据方法
Jan 28 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
Feb 28 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
Python 过滤错误log并导出的实例
Dec 26 Python
在python3中实现更新界面
Feb 21 Python
Python爬取阿拉丁统计信息过程图解
May 12 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
Feb 22 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
PHP也可以?成Shell Script
2006/10/09 PHP
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
php定界符
2014/06/19 PHP
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
jQuery控制TR显示隐藏的几种方法
2014/06/18 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
python编写微信远程控制电脑的程序
2018/01/05 Python
django文档学习之applications使用详解
2018/01/29 Python
tensorflow实现简单的卷积网络
2018/05/24 Python
Python实现矩阵相乘的三种方法小结
2018/07/26 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
Django自带的用户验证系统实现
2020/12/18 Python
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
社区志愿者心得体会
2014/01/03 职场文书
奥运会口号
2014/06/13 职场文书
校车安全责任书
2014/08/25 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
小学安全工作总结2015
2015/05/18 职场文书
pandas进行数据输入和输出的方法详解
2022/03/23 Python