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入门篇之函数
Oct 20 Python
在Python中处理时间之clock()方法的使用
May 22 Python
Python使用cookielib模块操作cookie的实例教程
Jul 12 Python
Python_LDA实现方法详解
Oct 25 Python
python修改list中所有元素类型的三种方法
Apr 09 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
Jul 19 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
Jun 11 Python
Django 大文件下载实现过程解析
Aug 01 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
Nov 15 Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 Python
python 实现一个简单的线性回归案例
Dec 17 Python
Python语法学习之进程的创建与常用方法详解
Apr 08 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
我的论坛源代码(五)
2006/10/09 PHP
第九节--绑定
2006/11/16 PHP
php中的MVC模式运用技巧
2007/05/03 PHP
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
php源代码安装常见错误与解决办法分享
2013/05/28 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
jQuery+PHP+MySQL实现无限级联下拉框效果
2016/02/19 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
2017/02/20 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
vue中导出Excel表格的实现代码
2018/10/18 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
2018/10/30 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
Python 面向对象部分知识点小结
2020/03/09 Python
python使用smtplib模块发送邮件
2020/12/17 Python
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
领导的自我鉴定
2013/12/28 职场文书
幼儿园教师教育感言
2014/02/28 职场文书
法人授权委托书格式
2014/04/08 职场文书
经典导游欢迎词
2015/01/26 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android
zabbix配置nginx监控的实现
2022/05/25 Servers