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 + openpyxl处理excel2007文档思路以及心得
Jul 14 Python
python中的变量如何开辟内存
Jun 26 Python
python自定义线程池控制线程数量的示例
Feb 22 Python
Python当中的array数组对象实例详解
Jun 12 Python
python 计算平均平方误差(MSE)的实例
Jun 29 Python
Python使用python-docx读写word文档
Aug 26 Python
详解python datetime模块
Aug 17 Python
重构Python代码的六个实例
Nov 25 Python
Pytest测试框架基本使用方法详解
Nov 25 Python
让文件路径提取变得更简单的Python Path库
May 27 Python
利用Pycharm连接服务器的全过程记录
Jul 01 Python
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
Aug 14 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文件操作的详细诠释
2013/06/21 PHP
win10环境PHP 7 安装配置【教程】
2016/05/09 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
javascript 实现map集合
2015/04/03 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
2015/06/08 Javascript
ajax读取数据后使用jqchart显示图表的方法
2015/06/10 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
Javascript创建类和对象详解
2017/05/31 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
vuex 的简单使用
2018/03/22 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
python中format()函数的简单使用教程
2018/03/14 Python
python删除文本中行数标签的方法
2018/05/31 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
静态变量和实例变量的区别
2015/07/07 面试题
有针对性的求职自荐信
2013/11/14 职场文书
情侣吵架检讨书
2014/02/05 职场文书
六一节目主持词
2014/04/01 职场文书
给校长的建议书100字
2014/05/16 职场文书
护士自荐信范文
2015/03/25 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
班干部学习委员竞选稿
2015/11/20 职场文书
Django使用redis配置缓存的方法
2021/06/01 Redis