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 相关文章推荐
Python制作钉钉加密/解密工具
Dec 07 Python
Python用5行代码写一个自定义简单二维码
Oct 21 Python
详解Python使用Plotly绘图工具,绘制甘特图
Apr 02 Python
python 函数中的内置函数及用法详解
Jul 02 Python
Python用字典构建多级菜单功能
Jul 11 Python
Python爬取破解无线网络wifi密码过程解析
Sep 17 Python
python新式类和经典类的区别实例分析
Mar 23 Python
Python基于进程池实现多进程过程解析
Apr 30 Python
Django使用Profile扩展User模块方式
May 14 Python
tensorflow转换ckpt为savermodel模型的实现
May 25 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 Python
python中_del_还原数据的方法
Dec 09 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实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
PHP 快速排序算法详解
2014/11/10 PHP
javascript 常用功能总结
2012/03/18 Javascript
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
深入学习JavaScript 高阶函数
2019/06/11 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
Python使用django搭建web开发环境
2017/06/09 Python
Python_LDA实现方法详解
2017/10/25 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
python实战之实现excel读取、统计、写入的示例讲解
2018/05/02 Python
python语音识别实践之百度语音API
2018/08/30 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
卫校中专生个人自我评价
2013/09/19 职场文书
农民入党思想汇报
2014/01/03 职场文书
物流管理专业职业生涯规划书
2014/01/06 职场文书
烹调加工管理制度
2014/02/04 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
法制宣传月活动方案
2014/05/11 职场文书
大气污染防治方案
2014/05/19 职场文书
工作目标责任书
2014/07/23 职场文书
民政局副局长民主生活会个人对照检查材料
2014/09/19 职场文书
个人工作表现评价材料
2014/09/21 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
小学班级管理心得体会
2016/01/07 职场文书
JavaScript 反射学习技巧
2021/10/16 Javascript
利用Sharding-Jdbc进行分库分表的操作代码
2022/01/22 Java/Android