从Python2转到Python3的字符串处理问题全整理及相关函数介绍

文 | Stansosleepy

从Python2转到Python3的字符串处理问题全整理及相关函数介绍

来源 | 简书

从python2转向python3遇到的首个问题是字符串问题,我花费了一些时间,将我所能想到的与字符串处理相关的内容都进行了如下整理。

1、Python2的字符串编码

在python2.X里,字符串编码存在麻烦之处,其所有“普通字符串”采用ascii码存储,unicode字符串则以16位unicode码存储,此时常常会出现转换以及乱码的问题。

1.1 python2中的普通字符串

>>> a="abc"
>>> print a
abc
>>> print repr(a)
'abc'
>>> type(a)

普通字符串能够被decode成unicode类型,unicode字符串的前面带有u 。
>>> a.decode()
u'abc'
>>> type(a.decode())

这里介绍一个函数repr,repr(a)会显示对象a(此对象为字符串)在解释器中的呈现形式,repr()旨在生成可被读取的表示形式 :

the interpreter

在这里能够看到,python中的“普通字符串”,在解释器里,是用ascii表示的。

1.2 python2中的中文

在python2中,字符串可以直接为中文

>>> b="中文"
>>> print b
中文
>>> print repr(b)
'\xe4\xb8\xad\xe6\x96\x87'
#懂行的人能看出这是utf-8编码的
>>> type(b)

b采用的是utf-8编码,它能够decode成unicode,存在两种方法。
#但是显示必须指出b的编码规则,
>>> b.decode("utf-8")
u'\u4e2d\u6587'
>>> unicode(b,"utf-8")
u'\u4e2d\u6587'
#在某些时候需要得到一些其他编码的字符串,比如gbk
需要对utf-8编码的字符串,先通过unicode进行中转,然后再将其encode到gbk编码 。
将b进行解码,解码格式为utf - 8,然后再将解码后的内容进行编码,编码格式为gbk,最后将编码后的结果赋值给c。
>>> c
'\xd6\xd0\xce\xc4

1.3 python2中的unicode

在上面其实已经接触到了一些unicode,简单来说,unicode是一种包容性很强的编码,若在一开始就把字符串定义为unicode类型,那么在完成字符串处理之后,能够自行encode成任意的编码。

>>> d=u'abc'
>>> type(d)

>>> d.encode("gbk")
'abc'
#来个复杂点的
>>> e=u"哈哈。&¥gaw"
>>> e
怪怪。&及5gaw
>>> e.encode("utf-16")
我无法识别你提供的内容,请提供正确的文本以便我进行改写。

unicode是一种较为基础的字符串类型,它能够被编码成其他字符串,因此在python3之后,默认的字符串类型变为了unicode,不再需要用“u”来定义unicode串,这也是致使python2和3不兼容的一项重要变化。

1.4 python2中的字节流

在python2里,str类型的字符串能够被打包成字节流,struct模块的详细用法能够参考这篇文章:

这看起来只是一个网址链接呀,没有具体可改写的句子内容,请你提供准确的句子以便我进行改写。

例子如下:

>>> e=u"哈哈"
>>> g=e.encode("gbk")
>>> d=e.encode("utf-8")
>>> g
'\xb9\xfe\xb9\xfe'
>>> d
'\xe5\x93\x88\xe5\x93\x88'
>>> import struct
#将g的前两个字节转成字节流,再转成unicode打印出来
将g中从索引0到索引1(不包括索引2)的元素,按照"ss"的格式进行打包,得到g1 。
>>> g1
'\xb9\xfe'
>>> g1.decode('gbk')
u'\u54c8'
>>> print g1.decode('gbk')
哈
#再来处理d,将d的字节流
>>> d
'\xe5\x93\x88\xe5\x93\x88'
你提供的内容存在错误信息,正确的Python代码应该是`d1 = struct.pack("ss", *d[0:2])` ,以下是改写后的内容:将`d`中从索引0到索引1(包含索引0和索引1)的元素,以格式字符串`ss`进行打包,得到`d1` 。
你提供的内容似乎存在错误信息,正确的Python代码应该是`d2 = struct.pack("ss", *d[2:4])` ,以下是改写后的内容:将`d`从索引2开始取到索引3的元素,使用`struct.pack`函数,按照格式字符串`"ss"`进行打包,结果赋值给`d2` 。
>>> d1
'\xe5\x93'
>>> d2
'\x88'
>>> print d1+d2
哈
#最后做个比较,加深印象
>>> d1+d2==g1
False
>>> g1
'\xb9\xfe'
将d1与d2进行组合,以“utf - 8”编码方式转换为unicode编码后,其结果与以“gbk”编码方式将g1转换为unicode编码的结果相等。
True

由此能够看出字节流实际上也是字符串,它们能够相加,也能够截断,相加之后还能够继续进行解码,进而得到同样的unicode对象。不过与此同时我们能够看到在python2里,字符串和字节流混用了同一个类型(str),然而字符串(str)和unicode又同时能够显示文字。这也是常常让人抓狂的所在。

好在python3在这方面有了巨大变革,对文本和二进制数据做了更清晰的区分,文本一直是Unicode,由str类型表示,二进制数据由bytes类型表示,Python 3不会以任何隐式方式混用str和bytes,这让两者区分格外清晰。你不可以拼接字符串与字节包,你也没办法在字节包里搜索字符串,(反过来同样如此),你还不能把字符串传入参数是字节包的函数,(反过来也是这样)。这是件好事。

2、Python3中的字符串

有了上述基础,不需要花费过多时间,就能够将python3中的字符串讲解清楚。

2.1 python3中的普通字符串

在python3里,str默认采用的编码是unicode,请看例子。

>>> a='abc'
>>> a
'abc'
>>> print (repr(a))
'abc'
>>> b="哈哈"
>>> print(b)
哈哈
>>> print (repr(b))
'哈哈'
将b进行编码,编码方式为unicode-escape 。
b'\\u54c8\\u54c8'
>>> b.encode("gbk")
b'\xb9\xfe\xb9\xfe'
>>> b.encode("utf-8")
b'\xe5\x93\x88\xe5\x93\x88'
>>> b.encode("utf-16")
b'\xff\xfe\xc8T\xc8T'
>>> b.decode
#可以看到python3中字符串没有decode功能了
追溯(最近的调用最后):
  File "", line 1, in 
属性错误:'str' 对象没有 'decode' 属性 。

在上面的例子能够看到,字符串encode之后,得到的结果是一个字节流,该字节流类似于b’\xb9\xfe\xb9\xfe’,这个字节流属于bytes类型,在python3中,bytes类型与str类型极为类似,存在它们之间的转换关系。

下面看个例子:

可以直接定义一个byte类型的字节流,将其直接decode,进而得到字符串,也就是unicode 。
>>> c=b'\xff\xfe\xc8T\xc8T'
>>> type(c)

>>> c.decode("utf-16")
'哈哈'
#或者
>>> str(c,encoding="utf-16")
'哈哈'

现在在做字符流截断的操作就很简单清楚了:

>>> e='哈哈'
>>> d=e.encode("utf-8")
>>> d
b'\xe5\x93\x88\xe5\x93\x88'
>>> d1=d[0:2]
>>> d2=d[2:3]
>>> (d1+d2).decode("utf-8")
'哈'

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

26阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读