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使用cx_Oracle模块将oracle中数据导出到csv文件的方法
May 16 Python
Python+Opencv识别两张相似图片
Mar 23 Python
python魔法方法-属性转换和类的表示详解
Jul 22 Python
python实现二分查找算法
Sep 21 Python
python编写微信远程控制电脑的程序
Jan 05 Python
Django数据库表反向生成实例解析
Feb 06 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
django使用LDAP验证的方法示例
Dec 10 Python
Python二叉树的镜像转换实现方法示例
Mar 06 Python
python 基于TCP协议的套接字编程详解
Jun 29 Python
浅谈Python中的模块
Jun 10 Python
Python中lru_cache的使用和实现详解
Jan 25 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/12/15 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
vue动态设置img的src路径实例
2018/09/18 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python socket网络编程步骤详解(socket套接字使用)
2013/12/06 Python
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
Python3实现Web网页图片下载
2016/01/28 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
python实现随机漫步算法
2018/08/27 Python
Python适配器模式代码实现解析
2019/08/02 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
基于html5实现的图片墙效果
2014/10/16 HTML / CSS
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
土木工程毕业生自荐信
2013/09/21 职场文书
技术总监管理职责范本
2014/03/06 职场文书
学校创先争优活动总结
2014/08/28 职场文书
终止劳动合同协议书
2014/10/05 职场文书
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python
windows安装python超详细图文教程
2021/05/21 Python
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL