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多线程编程(四):使用Lock互斥锁
Apr 05 Python
解读Python中degrees()方法的使用
May 18 Python
Python基础教程之正则表达式基本语法以及re模块
Mar 25 Python
Python正确重载运算符的方法示例详解
Aug 27 Python
Python中property属性实例解析
Feb 10 Python
python简单贪吃蛇开发
Jan 28 Python
Puppeteer使用示例详解
Jun 20 Python
pandas计算最大连续间隔的方法
Jul 04 Python
python 将日期戳(五位数时间)转换为标准时间
Jul 11 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
利用Pycharm连接服务器的全过程记录
Jul 01 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采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
Javascript代码混淆综合解决方案-Javascript在线混淆器
2006/12/18 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
JQuery伸缩导航练习示例
2013/11/13 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
22点关于jquery性能优化的建议
2014/05/28 Javascript
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
JavaScript 动态三角函数实例详解
2017/01/08 Javascript
js时间查询插件使用详解
2017/04/07 Javascript
javascript 面向对象实战思想分享
2017/09/07 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
vue实现点击展开点击收起效果
2018/04/27 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
Django框架 信号调度原理解析
2019/09/04 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
Python使用微信接入图灵机器人过程解析
2019/11/04 Python
Python实现加密接口测试方法步骤详解
2020/06/05 Python
python3的pip路径在哪
2020/06/23 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
PHP面试题集
2016/12/18 面试题
怎样客观的做好自我评价
2013/12/28 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
物理教学随笔感言
2014/02/22 职场文书
建议书怎么写
2014/03/12 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
2015年人民调解工作总结
2015/05/18 职场文书
一篇文章带你学习Mybatis-Plus(新手入门)
2021/08/02 Java/Android
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技