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实现多线程网页爬虫
Sep 06 Python
详解Python下ftp上传文件linux服务器
Jun 21 Python
对python中两种列表元素去重函数性能的比较方法
Jun 29 Python
python 提取文件指定列的方法示例
Aug 07 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
Nov 06 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
使用tensorboard可视化loss和acc的实例
Jan 21 Python
python针对Oracle常见查询操作实例分析
Apr 30 Python
python实现在线翻译
Jun 18 Python
Python hashlib和hmac模块使用方法解析
Dec 08 Python
利用Python实现最小二乘法与梯度下降算法
Feb 21 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
PR值查询 | PageRank 查询
2006/12/20 PHP
PHP 分页原理分析,大家可以看看
2009/12/21 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
js分页代码分享
2014/04/28 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
微信小程序 如何保持登录状态
2019/08/16 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
在python中利用最小二乘拟合二次抛物线函数的方法
2018/12/29 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
sklearn+python:线性回归案例
2020/02/24 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
HTML5 UTF-8 中文乱码的解决方法
2013/11/18 HTML / CSS
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
英国厨房与餐具用品为主的设计品牌:Joseph Joseph
2018/04/26 全球购物
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
《一个中国孩子的呼声》教学反思
2014/02/12 职场文书
社区工作者感言
2014/03/02 职场文书
优秀食品类广告词
2014/03/19 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
2014年学校后勤工作总结
2014/12/06 职场文书
一文搞懂如何实现Go 超时控制
2021/03/30 Python
nginx处理http请求实现过程解析
2021/03/31 Servers
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis
MySQL kill不掉线程的原因
2021/05/07 MySQL