浅析Python的codecs模块

  • 编码转化
  • codecs.open()
  • 总结
  • Reference

编码转化

codecs专门用作编码转换

# -*- encoding: gb2312 -*-
import  codecs, sysprint   ' - ' * 60
#  创建gb2312编码器
look   =  codecs.lookup( " gb2312 " )
#  创建utf-8编码器
look2  =  codecs.lookup( " utf-8 " )a  =   " 我爱北京 " print  len(a), a
#  把a编码为内部的unicode, 但为什么方法名为decode呢,我的理解是把gb2312的字符串解码为unicode
b  =  look.decode(a)
#  返回的b[0]是数据,b[1]是长度,这个时候的类型是unicode
print  b[1], b[0], type(b[0])
#  把内部编码的unicode转换为gb2312编码的字符串,encode方法会返回一个字符串类型
b2  =  look.encode(b[0])
#  发现不一样的地方了吧?转换回来之后,字符串长度由14变为了7! 现在的返回的长度才是真正的字数,原来的是字节数
print  b2[1], b2[0], type(b2[0])
#  虽然上面返回了字数,但并不意味着用len求b2[0]的长度就是7了, 仍然还是14,仅仅是codecs.encode会统计字数
print  len(b2[0])

上面的代码就是codecs的使用,是最常见的用法。另外还有一个问题就是,如果我们处理的文件里的字符编码是其他类型的呢?这个读取进行做处理也需要特殊的处理的。codecs也提供了方法.

codecs.open()

上面的代码就是codecs的使用,是最常见的用法。另外还有一个问题就是,如果我们处理的文件里的字符编码是其他类型的呢?这个读取进行做处理也需要特殊的处理的。codecs也提供了方法。

# -*- encoding: gb2312 -*-
import  codecs, sys#  用codecs提供的open方法来指定打开的文件的语言编码,它会在读 取的时候自动转换为内部unicode
bfile  =  codecs.open("dddd.txt " ,  ' r ' ,  " big5 " )
# bfile = open("dddd.txt", 'r') ss  =  bfile.read()
bfile.close()
#  输出,这个时候看到的就是转换后的结果。如果使用语言内建的open函数 来打开文件,这里看到的必定是乱码
print(ss, type(ss))

字符的编码是按照某种规则在单字节字符和多字节字符之间进行转换的某种方法。从单字节到多字节叫做decoding,从多字节到单字节叫做encoding。在这些规则中经常用到的无非是UTF-8和GB2312两种。

在Python中,codecs模块提供了实现这些规则的方法,通过模块公开的方法我们能够方便地获取某种编码方式的Encoder和 Decoder工厂函数(Factory function),以及StreamReader、StreamWriter和StreamReaderWriter类。

使用“import codecs”导入codecs模块。

codecs模块中重要的函数之一是lookup,它只有一个参数encoding,指的是编码方式的名称,即utf-8或者gb2312等 等。如下示例:

>>> import codecs
>>> t = codecs.lookup("utf-8" )
>>> print t
(<built-in function utf_8_encode>, <function decode at 0x00AA25B0>, <class encodings.utf_8.StreamReader at 0x00AA0720>, <class encodings.utf_8.StreamWriter at 0x00AA06F0>)
>>> encoder = t[0]
>>> decoder = t[1]
>>> StreamReader = t[2]
>>> StreamWriter = t[3]

lookup函数返回一个包含四个元素的TUPLE,其中t[0]是encoder的函数引用,t[1]是decoder的函数引用,t[2] 是UTF-8编码方式的StreamReader类对象引用,t[3]是UTF-8编码方式的StreamWriter类对象引用相信对Python熟悉的你肯定知道接下来该怎么用它们了。

codecs模块还提供了方便程序员使用的单独函数,以简化对lookup的调用。它们是:

getencoder(encoding)
getdecoder(encoding)
getreader(encoding)
getwriter(encoding)

如果我们只是想获取一种utf-8编码的encoder方法,那么只需要这样做:

>>> encoder = codecs.getencoder("utf-8" )

另外,对于StreamReader和StreamWriter的简化, codecs模块提供一个open方法。相对于built-in对象File的open方法,前者多了三个参数encoding, errors, buffering。这三个参数都是可选参数,但是对于应用来说,需要明确指定encoding的值,而errors和buffering使用默认值即可。使用方法如下:

>>> fin = codecs.open("e://mycomputer.txt" , "r" , "utf-8" )
>>> print fin.readline()
这是我的电脑
>>> fin.close()

总结

  • 总结一下,codecs模块为我们解决的字符编码的处理提供了lookup方法,它接受一个字符编码名称的参数,并返回指定字符编码对应的 encoder、decoder、StreamReader和StreamWriter的函数对象和类对象的引用。

  • 为了简化对lookup方法的调用, codecs还提供了getencoder(encoding)、getdecoder(encoding)、getreader(encoding)和 getwriter(encoding)方法;进一步,简化对特定字符编码的StreamReader、StreamWriter和 StreamReaderWriter的访问,codecs更直接地提供了open方法,通过encoding参数传递字符编码名称,即可获得对encoder和decoder的双向服务。

Reference

https://cloud.tencent.com/developer/article/1823452

加油!

感谢!

努力!

详解Python的codecs模块相关推荐

  1. python中heapq的库是什么_详解Python中heapq模块的用法

    详解Python中heapq模块的用法 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  详解Python中heapq模块的用法.txt ] (友情提示:右键点上行t ...

  2. 用于生成随机数的python标准库模块是_详解Python基础random模块随机数的生成

    详解Python基础random模块随机数的生成 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  详解Python基础random模块随机数的生成.txt ] ( ...

  3. python random库生成伯努利随机数的方法_详解Python基础random模块随机数的生成

    随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...

  4. python中re模块的span,详解Python正则表达式re模块

    正则是处理字符串最常用的方法,我们编码中到处可见正则的身影. 正则大同小异,python 中的正则跟其他语言相比略有差异: 1.替换字符串时,替换的字符串可以是一个函数 2.split 函数可以指定分 ...

  5. python哪里下载import包-详解python中的模块及包导入

    python中的导入关键字:import 以及from import 1.import import一般用于导入包以及模块. 不过有个小问题: (1)当导入的是模块的时候是可以直接可以使用模块内的函数 ...

  6. 【万字长文】详解Python时间处理模块-datetime

    datetime模块提供了用于处理日期和时间的类和对应的方法,一般用于处理年.月.日.时.分.秒的统计和计算等需求.在支持日期时间数学运算的同时,实现的关注点更着重于如何能够更有效地解析其属性用于格式 ...

  7. python twisted安装_图文详解python之twisted模块安装

    Twisted是一个事件驱动的网络框架. 最近开始学习了解Twisted,首先肯定要安装twisted模块. 但是在cmd下执行:pip install twisted 出现了下面的问题:" ...

  8. 详解Python的pyyaml模块

    一:什么是yaml yaml的英文名称是Yet Another Markup Language,直译过来就是标记语言.yaml用的比较多的地方就是写配置文件,比如yaml配置文件在Kubernetes ...

  9. python模块搜索原则_详解python模块路径查找规则及定义

    在python中创建一个模块非常简单,只需要在当前目录下创建一个 .py文件即可,系统自动将其解析成模块,文件名就是模块名.很多我们源码时代的同学都认为在查找模块时优先使用当前目录下的自定义模块.其实 ...

最新文章

  1. 运维人员的补丁盛宴 四月修复微软Adobe漏洞合计过百!
  2. 第4章javascript变量、作用域和内存回收
  3. 数据结构与算法--最小的k个数
  4. mysql常见问题记录
  5. lisp正负调换_lisp中如何把符号转换为字符串
  6. 罪人我举起酒杯的飞鸽传书
  7. 浏览器和驱动版本对应关系
  8. 96. Unique Binary Search Trees(I 和 II)
  9. Linux 以form表单形式上传文件
  10. BZOJ 3231: [Sdoi2008]递归数列
  11. 【时间序列分析】01.时间序列与平稳序列
  12. 模2加法,模2减法,模2除法
  13. 使用js获取input file的路径C:\fakepath\问题
  14. 传奇源码分析-服务器端
  15. 《少有人走的路:心智成熟的旅程》
  16. 兜兜转转,又回到了这里
  17. 安装mysql staring server 一直停滞,乃至失败-已解决
  18. 三方TabNavigator“斗艳”(Flex、JQuery UI和DoJo)
  19. (线段判交的一些注意。。。)nyoj 1016-德莱联盟
  20. jdk安装包解压后如何安装(jdk下载安装)

热门文章

  1. 菜鸟流程-Touching App(2)- 设置界面
  2. 计算机专业四川省录取分数线,四川省计算机信息职业技术学院2020年招生录取分数线...
  3. 13G编程电子书开始提供BT下载,下载说明及BT种子下载网址
  4. Django+scrapy,scrapy爬取的数据通过Django的模型保存到数据库
  5. 2006-03-05 20:41又是唱k
  6. tp-wdr5620 创建虚拟服务器,TP-LINK路由器 TL-WDR5620 设置、使用、问题解答综合指南...
  7. 【《中国工业经济》论文复刻】“一带一路”倡议与中国企业升级
  8. 10分钟学会打家劫舍问题
  9. 鼠标悬停图标反白filter
  10. 基于Python+openGauss实现(图形界面)多功能本地视频播放系统【100010086】