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返回昨天日期的方法
May 13 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
分享6个隐藏的python功能
Dec 07 Python
Window 64位下python3.6.2环境搭建图文教程
Sep 19 Python
深入理解Python异常处理的哲学
Feb 01 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
Aug 29 Python
Python将视频或者动态图gif逐帧保存为图片的方法
Sep 10 Python
python flask搭建web应用教程
Nov 19 Python
python文件绝对路径写法介绍(windows)
Dec 25 Python
Pytorch Tensor 输出为txt和mat格式方式
Jan 03 Python
Python操作MySQL数据库的示例代码
Jul 13 Python
Python制作春联的示例代码
Jan 22 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加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
php文件上传 你真的掌握了吗
2016/11/28 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
python 简易计算器程序,代码就几行
2009/08/29 Python
python对字典进行排序实例
2014/09/25 Python
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
matplotlib 纵坐标轴显示数据值的实例
2018/05/25 Python
python实现感知器算法(批处理)
2019/01/18 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
Python字符串的一些操作方法总结
2019/06/10 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
2019/08/28 Python
python实现扫雷小游戏
2020/04/24 Python
Python如何定义有默认参数的函数
2020/08/10 Python
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
校园广播稿100字
2014/10/06 职场文书
Go语言中break label与goto label的区别
2021/04/28 Golang
深入浅析React中diff算法
2021/05/19 Javascript
方法汇总:Python 安装第三方库常用
2022/04/26 Python