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‘ + ‘cd\xef‘           # 含有非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类型。

原文地址:https://www.cnblogs.com/chaoguo1234/p/9162061.html

时间: 2024-10-31 06:27:45

Python中的字符串的相关文章

Python中Unicode字符串

Python中Unicode字符串 字符串还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),0 - 255被用来表示大小写英文字母.数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A 的编码是65,小写字母 z 的编码是122. 如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且

零基础学python-7.1 python中的字符串简介与常用函数

在python中,字符串变成了一个强大的处理工具集,他是不可变的,也就是说字符串包含字符与字符的顺序,他不可以原处修改 字符串是我们后面需要学习的稍大一点的对象类别--序列的第一个代表 在字符串章节所说到的关于序列的操作,后面的列表与元组一样适用 字符串常用的一些操作与函数 操作 解释 s='' 空字符串 s="abc'd" 双引号和单引号相同 s='abc\n' 转义序列,使用变量完全显示字符, 只有使用print函数才能够显示转义 s="""aaaaa

Python中的字符串处理

Python转义字符 在需要在字符中使用特殊字符时,python用反斜杠(\)转义字符.如下表: 转义字符 描述 \(在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \000 空 \n 换行 \v 纵向制表符 \t 横向制表符 \r 回车 \f 换页 \oyy 八进制数yy代表的字符,例如:\o12代表换行 \xyy 十进制数yy代表的字符,例如:\x0a代表换行 \other 其它的字符以普通格式输出 Python字符

《python源码剖析》笔记 python中的字符串对象

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.      PyStringObject --> 变长不可变对象 typedef struct{ PyObject_VAR_HEAD//ob_size变量保存着对象中维护的可变长度内存的大小 longob_shash; //缓存该对象的hash值,用于dict的查询 intob_sstate; //标志该对象是否经过intern机制的处理 char ob_sval[1];// 字符指针

[笔记] 创建python中的字符串translator

将python中的字符串的某些字符转化为特定字符是经常用到string库中的maketrans()函数,以及translate()函数. 但是这两个函数比较抽象: maketrans函数产生的对象是一个表,这个数据结构对初学者并不友好. tranlate(table, deleteValue)函数所需的第一个参数是个表结构,也就是maketrans的返回值,deleteValue是所要删除的字符.这第二个参数很别扭:一个translate函数,有时候还能删除某些字符. 而且使用过程中,往往两个函

python中修改字符串的值

demo: info = 'abc' 如果要把上面的字符串info里面的c替换成d,要怎么操作呢? 方法一:使用python中的replace()方法 语法: str.replace(old, new[, max]) 参数: old -- 将被替换的子字符串. new -- 新字符串,用于替换old子字符串. max -- 可选字符串, 替换不超过 max 次 >>> info = "abc" >>> str = info.replace("

python中分割字符串split切割并选择输出 逐行读取文件后字符串拼接

字符串根据分隔符切割后输出,一下面 #!/usr/bin/python # -*- coding: utf-8 -*- str="abc,123 efg,567" #以空行分割后输出 print str.split(); #以','分割2次后输出 print str.split(',',2); #以','分割2次后输出地2个参数,1是从0开始,代表第二个参数 print str.split(',',2)[1]; 输出结果如下: ['abc,123', 'efg,567'] ['abc'

Python中去除字符串中空格的方法

Python中去除字符串中指定字符或者空格的方法有几种: str.strip() //该方法用于去除字符串开头和结尾的指定字符或字符串(默认为空格或换行符) str.lstrip() //该方法用于截掉字符串左边的空格或指定字符 str.rstrip() //该方法用于截掉字符串右边的空格或指定字符 所以若是要去除字符串中所有的空格可以使用如下方式: str.strip().lstrip.rstrip() 原文地址:https://www.cnblogs.com/EdenChanIy/p/993

python中根据字符串导入模块module

python中根据字符串导入模块module 需要导入importlib,使用其中的import_module方法 import importlib modname = 'datetime' datetime_module = importlib.import_module(modname) print(datetime_module) # <module 'datetime' from 'C:\\Users\\huchengyue\\AppData\\Local\\Programs\\Pyth