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处理cookie详解
Feb 07 Python
Python 中pandas.read_excel详细介绍
Jun 23 Python
获取Django项目的全部url方法详解
Oct 26 Python
Python 实现选择排序的算法步骤
Apr 22 Python
python 读文件,然后转化为矩阵的实例
Apr 23 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
Python模拟登录之滑块验证码的破解(实例代码)
Nov 18 Python
Python脚本去除文件的只读性操作
Mar 05 Python
浅谈python3打包与拆包在函数的应用详解
May 02 Python
python交互模式基础知识点学习
Jun 18 Python
python 批量将中文名转换为拼音
Feb 07 Python
python语言中pandas字符串分割str.split()函数
Aug 05 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通过正则表达式下载图片到本地的实现代码
2011/09/19 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
JS格式化数字保留两位小数点示例代码
2013/10/15 Javascript
Javascript获取当前时间函数和时间操作小结
2014/10/01 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
Python中将字典转换为列表的方法
2016/09/21 Python
python实现nao机器人手臂动作控制
2019/04/29 Python
三步实现Django Paginator分页的方法
2019/06/11 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
java关于string最常出现的面试题整理
2021/01/18 Python
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
小学教师听课制度
2014/02/01 职场文书
产品包装策划方案
2014/05/18 职场文书
社区服务标语
2014/07/01 职场文书
委托函范文
2015/01/29 职场文书
公司地址变更通知
2015/04/25 职场文书
雷锋的观后感
2015/06/10 职场文书
检讨书怎么写?
2019/06/21 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang
virtualenv隔离Python环境的问题解析
2022/06/21 Python