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解析网页源代码中的115网盘链接实例
Sep 30 Python
为Python程序添加图形化界面的教程
Apr 29 Python
Python中__new__与__init__方法的区别详解
May 04 Python
Python简单实现子网掩码转换的方法
Apr 13 Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 Python
基于PyQt4和PySide实现输入对话框效果
Feb 27 Python
python实现12306登录并保存cookie的方法示例
Dec 17 Python
使用python实现数组、链表、队列、栈的方法
Dec 20 Python
Python实现爬取并分析电商评论
Jun 19 Python
python中pyplot基础图标函数整理
Nov 10 Python
opencv 分类白天与夜景视频的方法
Jun 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实现每天自动变换随机问候语的方法
2015/05/12 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
二级域名或跨域共享Cookies的实现方法
2008/08/07 Javascript
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
30分钟就入门的正则表达式基础教程
2013/02/25 Javascript
document.getElementBy(&quot;id&quot;)与$(&quot;#id&quot;)有什么区别
2013/09/22 Javascript
简单的Jquery全选功能
2013/11/07 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
angular ngClick阻止冒泡使用默认行为的方法
2016/11/03 Javascript
BootStrap表单宽度设置方法
2017/03/10 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
jquery-ui 进度条功能示例【测试可用】
2019/07/25 jQuery
Python同时向控制台和文件输出日志logging的方法
2015/05/26 Python
基于Django模板中的数字自增(详解)
2017/09/05 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
Python正则表达式和re库知识点总结
2019/02/11 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
.dcm格式文件软件读取及python处理详解
2020/01/16 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
优秀求职信范文分享
2013/12/19 职场文书
应届生求职自荐信范文
2014/04/07 职场文书
英文演讲稿
2014/05/15 职场文书
个人贷款收入证明
2014/10/26 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
学习雷锋主题班会
2015/08/14 职场文书
合作协议书格式范本
2016/03/21 职场文书
辞职信怎么写?你都知道吗?
2019/06/24 职场文书
2019最新版火锅店的创业计划书 !
2019/07/12 职场文书
在Docker容器中部署SQL Server
2022/04/11 Servers