Python中的字符串
Posted chaoguo1234
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中的字符串相关的知识,希望对你有一定的参考价值。
在Python中,字符串的类型可以归为三类:str,bytes,bytearray,其中str和bytes是不可变类型,而bytearray是可变类型。由于Python 2.X和Python 3.X的区别,相应的,它们在Python 2.X和Python 3.X中有不同的意义。
在Python 2.X中,str即可以表示8bit的文本(例如ASCII文本,Latin-1文本),也可以表示二进制数据,也就是说,在Python 2.X中,str和bytes类型是等价的;如果要表示Unicode文本,需要单独使用unicode字符串;而bytearray只有在Python 2.6中才有,表示可以修改的bytes数据;
在Python 3.X, str表示Unicode文本,bytes表示二进制数据,二者不等价;bytearray和Python 2.X中的意义一样,也表示可以修改的bytes数据。
所有的的字符串问题,包括读写文件,都可以归纳为上述问题。
str、bytes和bytearray相互转换
1 Python 2.X
# str与bytes等价 >>>B = b‘spam‘ # bytes字面量 >>>S = ‘eggs‘ # str字面量 >>>type(B), type(S) (<type ‘str‘>, <type ‘str‘>) # str与unicode的转换,也即bytes与unicode的转换 >>>str(u‘spam‘) #unicode转换为str spam >>>unicode(‘spam‘) #str转换为unicode,unicode函数可以选择编码,默认是平台编码 u‘spam‘ # str与bytearray的转换,也即bytes与bytearray的转换 >>>S = ‘spam‘ >>>C = bytearray(S) >>>C bytearray(b‘spam‘)
2 Python 3.X
# str与bytes的转换,有两种方法: # 1 使用str类型的encode方法 # 2 使用bytes函数 >>>S = ‘eggs‘ >>>S.encode() b‘eggs‘ >>>bytes(S, encoding=‘ascii‘) b‘eggs‘ # bytes与str的转换,有两种方法: # 1 使用bytes类型的decode方法 # 2 使用str函数 >>>B = b‘spam‘ >>>B.decode() ‘spam‘ >>>str(B, encode=‘asci‘) ‘spam‘ # str与bytearray的转换 >>>S = ‘spam‘ >>>C = bytearray(S, ‘latin1‘) # 必须指明编码 >>>C bytearray(b‘spam‘) # bytes与bytearray的转换 >>>B = b‘spam‘ >>>C = bytearray(B) >>>C bytearray(b‘spam‘)
对于上面的由bytes转换为str的例子,如果调用str函数不传递编码参数‘ascii‘,那么str函数并不是使用平台的默认编码,而是返回bytes对象的一个print string,看例子就明白了:
>>>B = b‘spam‘ >>>str(B) "b‘spam‘"
字面量的表示方法
1 Pyhon 2.X
在Python 2.X中,声明字面量可以使用前缀b/B,u/U。其中对于Python 2.X来说,不使用前缀和使用前缀b/B的效果是一样的,都表示str(或者bytes)类型,如果要表示unicode字符串,则必须带前缀u/U。
2 Python 3.X
在Python 3.X中,声明字面量可以使用b/B,u/U前缀。其中,对于Python 3.X来说,不使用前缀和使用前缀u/U的效果是一样的,都表示str类型(也即unicode字符串),如果要表示bytes类型,那么必须加前缀b/B。但是需要注意一点的就是,u/U前缀在Python 3.0中不支持。
字面量中嵌入字符编码
Python支持在字符串字面量中直接嵌入字符编码,字符编码的形式可以为xNN,也可以是uNNNN,也可以是UNNNNNNNN。
1 Python 2.X
由于str类型(也即是bytes类型)在Python 2.X中是8bit的,因此只能使用XNN的形式;对于unicode字符串,可以使用上面三种形式:
>>>S = ‘x31‘ # 字符‘1‘的编码为x31 >>>S ‘1‘ >>>S = ‘u0031‘ # u形式不支持 >>>S ‘\u0031‘ >>>S = ‘U00000031‘ # U形式不支持 >>>S ‘\U00000031‘ >>>S = u‘x31‘ >>>S u‘1‘ >>>S = u‘u0031‘ >>>S u‘1‘ >>>S = ‘U00000031‘ >>>S u‘1‘
2 Python 3.X
由于Python 3.X中str类型就是unicod的,所以支持上述三种形式,相反,Python 3.X中的bytes类型只支持xNN:
>>>S = ‘x31‘ >>>S ‘1‘ >>>S = ‘u0031‘ >>>S ‘1‘ >>>S = ‘U00000031‘ >>>S ‘1‘ >>>S = b‘x31‘ >>>S b‘1‘ >>>S = b‘u0031‘ #不识别 >>>S b‘\u0031‘ >>>S = b‘U00000031‘ #不识别 >>>S b‘\U00000031‘
为了进一步的理解,我们可以使用len函数来看长度。对于Python 2.X和Python 3.X,凡是打印出字符‘1‘的,使用len计算长度都是1,凡是不识别的,对于u形式,len计算的长度是6,对于U形式,len计算的长度是10。
类型混用
1 Python 2.X
在Python 2.X中,如果unicode字符串与bytes类型(也即str类型)混用,如果bytes类型中只包含ASCII字符,那么,Python自动将bytes类型转换成unicode字符串:
>>>u‘ab‘ + ‘cd‘ u‘abcd‘ >>>u‘ab‘ + ‘cdxef‘ # 含有非ASCII字符,不支持 UnicdoeDecodeError:‘ascii‘ codec can‘t decode byte 0xef in position 2:orinal not in range(120)
2 Python 3.X
unicode字符串与bytes类型混用,Python不会自动转换,必须手动转换成统一类型,要么统一成unicode字符串,要么统一成bytes类型。
以上是关于Python中的字符串的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 多处理进程中运行较慢的 OpenCV 代码片段
Python代码阅读(第38篇):根据谓词函数和属性字符串构造判断函数