字符串编码转换
美国标准信息交换码(ASCII码):最多只能表示256个符号,每个符号占一个字节
中文编码标准(GBK 和 GB2312):一个字节表示英文字母,两个字节表示中文字符
国际通用编码(UTF-8):采用一个字节表示英文字符,3个字节表示中文
Python 3.x 中,默认采用UTF-8编码有效的解决了中文乱码的问题
Python中有str
和bytes
这两种常用的字符串类型,但是它们不能拼接在一起。其中,str
表示Unicode字符(ASCII码或者其他),bytes
表示二进制数据(包括编码的文本),通常情况下,str
在内存中以Unicode字符表示,一个字符对应若干个字节。但是要在网络上传输str
,或者要将str
保存到磁盘上,就需要把str
转换为bytes
(字节类型)
bytes
类型的数据是带有b
前缀的字符串(用单引号或双引号表示),str
与bytes
之间可以通过encode()
和decode()
方法进行转换
使用encode()
方法编码
str
对象有一个encode()
方法可以将字符串转换为二进制数据bytes
,这个转换过程称为编码。其语法格式如下:
str_name.encode(encoding="utf-8"[,errors='strict'])
str_name
:表示要进行转换的字符串对象。encoding="utf-8"
:可选参数,用于指定在编码时需要采用的编码,默认为UTF-8
,若要使用中文,可以将该参数设置为GB2312
;errors='strict'
:可选参数,用于指定错误的处理方式,默认为strict
。
errors
的可选值有:
- strict:遇到非法字符就抛出异常
- ignore:忽略非法字符
- replace:用“?“替换非法字符
- xmlcharrefreplace:使用XML的字符引用
encode()
方法不会修改原字符串
使用decode()
方法解码
bytes
对象有一个decode()
方法可以将二进制型数据转换为字符串,将使用encode()
方法转换的结果再转换为字符串,称为解码。bytes_name
为要转换的二进制对象,通常都是encode()
转换的结果;encoding
和errors
的作用及使用与encode()
方法相同。其语法格式如下:
types_name.decode(encoding="utf-8"[,errors='strict'])
字符串常用操作
拼接字符串
字符串通常可以使用+
将两个字符串进行拼接,但是若要拼接非字符串类型的数据,则需要使用str()
方法将该数据强制转换为字符串后再进行拼接,拼接后会产生一个新的字符串对象。如下示例:
english = "Hello, World!"
chinese = "你好,世界!"
print(english + "--" + chinese)
计算字符串的长度
在Python中,汉字在GBK
和GB2312
编码中占两个字节,而在UTF-8
和Unicode
中一般占3个(或4个)字节。其语法格式如下:
len(string) # string 为被计算长度的字符串对象
倘若我定义一个字符串为string = 'Hello 世界!'
,统计string
的长度,代码如下:
string = "Hello 世界!"
print(string) # 输出结果为9
默认情况下,当使用
len()
函数计算字符串长度时,不区分英文、数字和汉字,所有字符都被认为是一个字符。
在开发中,如果需要获取采用utf-8
或者gbk
编码的字符串长度,则可以使用下面代码:
string = "Hello 世界!"
# 计算UTF-8编码的字符串长度
lenght_utf8 = len(string.encode())
print("UTF-8编码的字符串长度:" + str(lenght_uft8)) # 15
# 计算gbk编码的字符串长度
lenght_gbk = len(string.encode("gbk"))
print("gbk编码的字符串长度:" + str(lenght_gbk)) # 12
截取字符串
字符串也是序列,因此也支持切片操作。其语法结构如下:
string[start, end, step]
start
:指定要截取的第一个字符的索引(包含此位置),若省略,默认为0end
:指定要截取的最后一个字符的索引(不包含此位置),若省略,默认为序列的长度step
:指定切片的步长,若省略,默认步长为1,当省略该步长时,最后一个冒号可以同时省略
分割字符串
字符串对象的split()
方法可以实现字符串的分割,把一个字符串按照指定的分割符切分为字符串列表。语法如下:
'''字符串名.split(分隔符, 分割次数n) 指分割前n个'''
string.split(sep,maxsplit)
sep
用于指定分隔符,可以包含多个字符,默认为None
,即所有空字符(空格、换行、制表符)。maxsplit
用于指定分割的次数,若指定为-1或未指定,则表示无限制,否则返回结果列表元素的个数最多为maxsplit + 1
。
合并字符串
合并字符串会将多个字符串采用固定的分隔符连接在一起,合并字符串可以使用字符串对象的join()
方法实现,其语法格式如下:
new_str = string.join(iterable)
new_str
:表示合并后生成的新字符串string
:字符串类型,用于指定合并时的分隔符iterable
:可迭代对象,该对象的所有元素都将被合并成一个新的字符串
如下示例代码:
list = ["小王","小刘","小张"]
new_str = "牵着".join(list)
print(new_str) # 输出结果为:小王牵着小刘牵着小张
检索字符串
count()
方法用于检索指定字符串在另一个字符串中出现的次数,若不存在则返回0,其语法格式如下:
string.count(sub[,start[,end]])
string
:原字符串sub
:需要检索的字符串start
:可选参数,表示检索范围的起始位置索引,默认从头开始检索end
:可选参数,表示检索的结束位置索引,默认检索到结束
find()
方法用于检索是否包含指定的子字符串,如果检索的子字符串不存在,则返回-1,否则返回首次出现该子字符串的位置索引;rfind()
方法与find()
类似,只是表示从右边开始检索。其语法格式如下:
string.find(sub[,start[,end]])
string.rfind(sub[,start[,end]])
index()
方法与find()
方法类似,也用于检索是否包含指定的子字符串,只是当index(sub)
所检索的sub
不存在于被检索的字符串,则会抛出异常;rindex()
方法与index()
类似,只是表示从右边开始检索。其语法格式如下:
string.index(sub[,start[,end]])
string.rindex(sub[,start[,end]])
startswith()
方法用于检索字符串是否以指定的子字符串开头,返回bool
类型。其语法格式如下:
string.startswith(sub[,start[,end]])
endswith()
方法用于检索字符串是否以指定的子字符串结尾,返回bool
类型。其语法格式如下:
string.endswith(sub[,start[,end]])
字母的大小写转换
lower()
方法用于将字符串中的全部大写字母转换为小写字母。若发生转换则将生成新的字符串,否则返回原字符串。其语法格式如下:
new_str = string.lower()
upper()
方法用于将字符串中的全部小写字母转换为大写字母。若发生转换则将生成新的字符串,否则返回原字符串。其语法格式如下:
new_str = string.upper()
去除空格和特殊字符
strip()
方法用于去掉字符串左、右两侧的空格和特殊字符,其语法格式如下:
string.strip([char])
char
:可选参数,用于指定要去除的字符,可以指定多个。默认将去除空格、制表符\t、Enter符\r、换行符\n等。
lstrip()
方法用于去掉字符串左侧的空格和特殊字符,其语法格式如下:
string.lstrip([char])
rstrip()
方法用于去掉字符串右侧的空格和特殊字符,其语法格式如下:
string.rstrip([char])
格式化字符串
格式化字符串好比制作一个模板,在模板中预留几个位置,然后更具需求填入内容,这些空位需要指定的符号(占位符)进行标记,而这些符号将不会被显示。格式化字符串的方式有两种,分别是:
- 使用
%
操作符 - 使用字符串对象的
format()
方法(重点)
字符串提供了format()
方法对字符串进行格式化,其语法格式如下:
string.format(args)
str
用于指定字符串的显示样式(模板);arg
用于指定要转换的项,若有多项,则用逗号进行分割。在创建模板时,需要使用{}
和:
指定占位符,基本语法格式如下:
{[index][:[[fill]align][#][width][.precision][type]]}
index
:可选参数,用于指定要设置格式的对象在参数列表中的索引位置,索引值从0开始,如果省略,则根据值的先后顺序进行自动分配。fill
:可选参数,用于指定空白处填充的字符align
:可选参数,用于指定对齐的方式。该参数的值为>
时,表示内容(包括符号)右对齐;值为<
时,表示内容左对齐;值为=
时,只对数字类型生效,表示数字内容右对齐,如果是负数,则将负号放在填充内容的左侧,如果是正数,不添加符号;值为^
时,表示内容居中。该参数需要配合width
一起使用。sign
:可选参数,用于指定有无符号数(值为“+”表示正数加正号,负数加负号;值为“-”表示正数不变,负数加负号;值为空格表示正数加空格,负数加负号)。#
:可选参数,对于二进制、八进制和十六进制,如果加上“#”,表示会显示0b/0o/0x前缀,否则不显示。width
:可选参数,用于指定所占宽度.precision
:可选参数,用于指定保留的小数位数type
:可选参数,用于指定类型
取值如下表所示:
格式字符 | 说明 | 格式字符 | 说明 |
---|---|---|---|
S | 对字符串类型进行格式化 | b | 将十进制整数自动转换成二进制表示,并对其进行格式化 |
D | 十进制整数 | o | 将十进制整数自动转换成八进制表示,并对其进行格式化 |
C | 将十进制整数自动转换成对应的Unicode字符 | x或者X | 将十进制整数自动转换成十六进制表示,并对其进行格式化 |
e或者E | 转换为科学计数法表示再格式化 | f或者F | 转换为浮点数(默认小数点后保留6位),并对其进行格式化 |
g或者G | 自动在e和f,或者E和F之间进行切换 | % | 显示百分比(默认显示小数点后6位) |
示例代码如下:
temp = '编号:{:0>5s}\t姓名:{:s}\t年龄:{:d}\t'
dic = {'小王':18, '小张':20, '小兰':19}
n=0
for key,value in dic.items():
n += 1
print(temp.format(str(n), key, value))
上述代码的输出结果是:
编号:00001 姓名:小王 年龄:18
编号:00002 姓名:小张 年龄:20
编号:00003 姓名:小兰 年龄:19
文章地址 : 暑假Python基础整理 – 字符串