Python2.x和3.x下maketrans与translate函数使用上的不同


Posted in Python onApril 13, 2015

maketrans和translate函数是进行字符串字符编码的常用方法。本文着重点在于演示其基本用法和在不同版本下操作的差异。本文提到的2.X版本指2.6以上的版本,3.X版本指3.1以上的版本。
    2.X版本把字符串基本分为两种:unicode字符串和8位字符串str,后者包含字节数据和我们常见的ASCII码数据;而3.X版本则重新对字符串进行了划分,分为了字节字符串bytes和文本字符串str,两者都是不可变的,所以添加了一个可变的字节字符串类型bytearray。
     2.X版本中string类型和str、unicode类型大量方法是重复的,所以3.X版本不提倡使用string模块中与str重复的方法。string模块中还有很多有用的常量和方法,比如string.digits,可以在字符串编码中方便地使用。

     2.X中maketrans和translate函数的签名:

string.maketrans(from, to)

  string.translate(s, table[, deletechars])
  str.translate(table[, deletechars])
  unicode.translate(table)

    3.X中maketrans和translate函数的签名:

static str.maketrans(x[, y[, z]])
  static bytes.maketrans(from, to)
  static bytearray.maketrans(from, to)

  str.translate(map)
  bytes.translate(table[, delete])
  bytearray.translate(table[, delete])

    从中可以看出,相对于2.X的string模块的maketrans方法,3.X中分别提供了三个静态方法用于创建映射表。
   下面让我们看一个简单的例子来说明字符串转换的过程:
    2.X下的演示过程:

>>> import string                     #导入string模块
  >>> map = string.maketrans('123', 'abc') #建立映射表,将字符串中含有的'1','2','3'替换为'a','b','c'
  >>> s = '54321123789'                #转换前的字符串
  >>> s.translate(map)                  #用创建的映射表map转换字符串
  '54cbaabc789'                        #转换后的字符串

    3.X下的演示过程:

>>> map = str.maketrans('123','abc')
  >>> s = '54321123789'
  >>> s.translate(map)
  '54cbaabc789'

    2.X使用了string的maketrans函数,而3.X使用了str的maketrans函数,除了这一点,使用方法是基本相同的。若指定字符串中要删除的字符时,使用就会略有不同,如下:
    2.X下的演示过程:

>>> import string
  >>> map = string.maketrans('123', 'abc')
  >>> s = '54321123789'
  >>> s.translate(map, '78')        #除了转换,还要删除字符串中的字符'7','8'
  '54cbaabc9'               #转换后的字符串没有字符'7','8'

    3.X下的演示过程:

>>> map = str.maketrans('123','abc', '78')#要删除的字符需要在这指定
  >>> s = '54321123789'
  >>> s.translate(map)
  '54cbaabc9'

    我在读《Python Cookbook》遇到了一个基于2.X版本的例子,如下

import string
  def translator(frm='', to='', delete='', keep=None):
    if len(to) == 1:
      to = to * len(frm)
    trans = string.maketrans(frm, to)
    if keep is not None:
      allchars = string.maketrans('', '')
      delete = allchars.translate(allchars, keep.translate(allchars,delete))
    def translate(s):
      return s.translate(trans, delete)
    return translate

    allchars应该是一个返回的映射表,为什么还可以调用translate方法,所以它应该是一个str类型,测试如下:

>>> import string
  >>> map = string.maketrans('123', 'abc')
  >>> type(map)
  <type 'str'>

    在3.X版本中这个方法不能正常通过运行,那么错在什么地方呢,我们看看映射表是什么类型:

>>> map = str.maketrans('123','abc')
  >>> type(map)
  <class 'dict'>

    知道了映射表的类型了,我们就可以对其进行“后期加工”,像上面《Python Cookbook》中的例子一样,来满足我们的编码要求。

   上面讨论的例子用的字符串是ASCII字符组成的,如果是字节类型,2.X版本中操作是一样的,3.X中调用bytes或bytearray的函数;若是unicode类型的,2.X需要用unicode的translate方法,注意下面的代码

 

>>> print u"hallo".translate({97:u'e'})
  hello
  >>> print u"hallo".translate({'a':u'e'})
  hallo
  >>> print u"hallo".translate({u'a':u'e'})
  hallo

    结果之所以不一样,查阅手册可知unicode的translate方法的映射表也就是字典的键必须是unicode的位序数,值可以是unicode的位序数、unicode字符串或这None。

Python 相关文章推荐
windows下python之mysqldb模块安装方法
Sep 07 Python
使用Python爬取最好大学网大学排名
Feb 24 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
Jul 30 Python
Python数据可视化库seaborn的使用总结
Jan 15 Python
python实现彩色图转换成灰度图
Jan 15 Python
python批量图片处理简单示例
Aug 06 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
TensorFlow固化模型的实现操作
May 26 Python
Django通过设置CORS解决跨域问题
Nov 26 Python
python简单实现插入排序实例代码
Dec 16 Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 Python
Python 数据可视化工具 Pyecharts 安装及应用
Apr 20 Python
使用Pyrex来扩展和加速Python程序的教程
Apr 13 #Python
在Python中使用itertools模块中的组合函数的教程
Apr 13 #Python
Python中用Spark模块的使用教程
Apr 13 #Python
简单理解Python中基于生成器的状态机
Apr 13 #Python
Python中的高级函数map/reduce使用实例
Apr 13 #Python
Python遍历目录的4种方法实例介绍
Apr 13 #Python
用Python生成器实现微线程编程的教程
Apr 13 #Python
You might like
php实现根据url自动生成缩略图的方法
2014/09/23 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
调用innerHTML之后onclick失效问题的解决方法
2014/01/28 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
jQuery控制TR显示隐藏的三种常用方法
2014/08/21 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
nodejs的HTML分析利器node-jquery用法浅析
2016/11/08 NodeJs
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
Vue的百度地图插件尝试使用
2017/09/06 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
联想英国官网:Lenovo英国
2019/07/17 全球购物
为数据库创建索引都需要注意些什么
2012/07/17 面试题
艺术设计专业个人求职信
2013/09/21 职场文书
土木工程毕业生自荐信
2013/11/12 职场文书
道德模范先进事迹
2014/02/14 职场文书
献爱心大型公益活动策划方案
2014/09/15 职场文书
查摆问题整改措施
2014/10/24 职场文书
退学证明范本3篇
2014/10/29 职场文书
2014年政教处工作总结
2014/12/20 职场文书
整脏治乱工作简报
2015/07/21 职场文书
Golang 如何实现函数的任意类型传参
2021/04/29 Golang
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js