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实现截屏的函数
Jul 25 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
Python实现字符串与数组相互转换功能示例
Sep 22 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
Django中使用第三方登录的示例代码
Aug 20 Python
python 获取页面表格数据存放到csv中的方法
Dec 26 Python
python celery分布式任务队列的使用详解
Jul 08 Python
Python对接 xray 和微信实现自动告警
Sep 17 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
python和c语言哪个更适合初学者
Jun 22 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
Feb 06 Python
Python 实现Mac 屏幕截图详解
Oct 05 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生成随机密码的三种方法小结
2010/09/04 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
js实现数组转换成json
2015/06/26 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
js如何验证密码强度
2020/03/18 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
js实现html滑动图片拼图验证
2020/06/24 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
python简单程序读取串口信息的方法
2015/03/13 Python
python脚本设置系统时间的两种方法
2016/02/21 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
python cumsum函数的具体使用
2019/07/29 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
android面试问题与答案
2016/12/27 面试题
出纳担保书范文
2014/04/02 职场文书
Mysql 用户权限管理实现
2021/05/25 MySQL
Python数据类型最全知识总结
2021/05/31 Python
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android