作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
字符串编码转换
说起字符串,不得不提的就是字符编码,让我们先简单回顾一下字符串编码的发展史。
- 最早的字符串编码,是美国的标准信息交换码,即 ASCII 码。它仅对 10 个数字、26 个大写英文字母、26 个小写英文字母,以及一些其他符号进行了编码。ASCII 码最多只能表示 256 个字符,每个字符占一个字节。
- 随着信息技术的发展,各国的文字都需要进行编码,于是出现了 GBK、GB2313、UTF-8 等编码。其中 GBK 和 GB2313 是我国制定的中文编码标准,使用一个字节表示英文字母,2 个字节表示中文字符。
- 而 UTF-8 是国际通用的编码,对全世界所有国家需要用到的字符都进行了编码。UTF-8 采用一个字节表示英文字符,3 个字节表示中文。在 Python 3.x 中,默认采用的编码格式是 UTF-8,采用这种编码有效的解决了中文乱码的问题。
- 使用 encode() 方法编码
encode() 方法为 str 对象的方法,用于将字符串转换为二进制数据(即 bytes),也称为 “编码”,其语法格式如下:
str.encode([encoding="utf-8"][,errors="strict"])
str:表示要进行转换的字符串;
encoding=“utf-8”:可选参数,用于指定进行转码时采用的字符编码,默认为 UTF-8。如果想使用简体中文,也可以设置为 GB2313。当只有这一个参数时,也可以省略前面的 “encoding=”,直接写编码;
error=“strict”:可选参数,用于指定错误处理方式。可以选择的值有:strict(遇到非法字符就抛出异常)、ignore(忽略非法字符)、replace(用 “?” 替换非法字符)或 xmlcharrefreplace(使用XML的字符引用)等,默认是 strict;
示例:
verse = "野渡无人舟自横"
byte1 = verse.encode("GBK")
byte2 = verse.encode("UTF-8")
print("原字符串为:", verse)
print("转换 GBK 后:", byte1)
print("转换 UTF-8 后:", byte2)
上述例子的运行结果为:
原字符串为: 野渡无人舟自横
转换 GBK 后: b'\xd2\xb0\xb6\xc9\xce\xde\xc8\xcb\xd6\xdb\xd7\xd4\xba\xe1'
转换 UTF-8 后: b'\xe9\x87\x8e\xe6\xb8\xa1\xe6\x97\xa0\xe4\xba\xba\xe8\x88\x9f\xe8\x87\xaa\xe6\xa8\xaa'
bytes 类型的数据是带有 b 前缀的字符串(用单引号或双引号表示)
- 使用 decode() 方法解码
decode() 方法为 bytes 对象的方法,用于将二进制数据转换为字符串,即把使用 encode() 方法转换的结果再转换为字符串,也称为 “解码”,其语法格式如下:
bytes.decode([encoding="utf-8"][,errors=""strict])
示例:
byte = b'\xd2\xb0\xb6\xc9\xce\xde\xc8\xcb\xd6\xdb\xd7\xd4\xba\xe1'
verse = byte.decode("GBK")
print("解码后:", verse)
上述例子的运行结果为:解码后: 野渡无人舟自横
字符串常规操作
- 拼接字符串
使用 ‘+’ 运算符对多个字符串进行拼接,产生一个字符串对象。字符串不允许直接与其他类型的数据拼接,需要先使用 str() 函数转换为字符串。
示例:
str1 = "我今天一共走了 "
num = 12500
str2 = " 步"
print(str1 + str(num) + str2)
上述例子的运行结果为:我今天一共走了 12500 步
- 计算字符串长度
Python 中提供了 len() 函数获取字符串的长度。
示例:
str = "人生苦短,我用 Python"
length1 = len(str)
length2 = len(str.encode("UTF-8"))
print("字符串长度为:", length1)
print("UTF-8 编码的字符串长度为:", length2)
上述例子的运行结果为:
字符串长度为: 14
UTF-8 编码的字符串长度为: 28
使用 len() 函数计算长度时,不区分英文、数字和汉字,所有字符都认为是一个长度。如果需要获取实际的字符串长度,需要使用 encode() 编码后再获取
- 截取字符串
由于字符串也属于序列,所以要截取字符串,可以采用切片的方法来实现。
示例:
str = "人生苦短,我用 Python" # 定义字符串
substr1 = str[1] # 截取第 2 个字符
substr2 = str[5:] # 从第 6 个字符开始截取
substr3 = str[:5] # 从左边开始截取 5 个字符
substr4 = str[2:8] # 截取第 3 个到第 8 个字符
print(substr1)
print(substr2)
print(substr3)
print(substr4)
上述例子的运行结果为:
生
我用 Python
人生苦短,
苦短,我用
在截取字符串时,如果指定索引不存在,则会抛出异常。可以使用 try…except 语句捕获异常
- 分割、合并字符串
字符串对象的 split() 方法可是实现字符串的分割。即把一个字符串按照指定的分隔符切分为字符串列表。该列表的元素中,不包括分隔符,语法格式如下:
str.split(sep, maxsplit)
str:表示要进行分割的字符串;
sep:用于指定分隔符,可以包含多个字符串,默认为 None,即所有空字符(包括空格、换行 “\n”、制表符 “\t” 等);
maxsplit:可选参数,用于指定分割的次数,如果不指定或者为 -1,则分割次数没有限制,否则返回结果列表的元素个数最多为 maxsplit + 1;
返回值:分割后的字符串列表;
示例:
str = "我 要 上 百 度 >>> www.baidu.com 看 电 影 !" # 定义字符串
list1 = str.split()
list2 = str.split('>')
list3 = str.split('.')
list4 = str.split(' ', 4)
list5 = str.split('<')
print(str)
print(list1)
print(list2)
print(list3)
print(list4)
print(list5)
上述例子的运行结果为:
我 要 上 百 度 >>> www.baidu.com 看 电 影 !
['我', '要', '上', '百', '度', '>>>', 'www.baidu.com', '看', '电', '影', '!']
['我 要 上 百 度 ', '', '', ' www.baidu.com 看 电 影 !']
['我 要 上 百 度 >>> www', 'baidu', 'com 看 电 影 !']
['我', '要', '上', '百', '度 >>> www.baidu.com 看 电 影 !']
['我 要 上 百 度 >>> www.baidu.com 看 电 影 !']
注意:在 split() 方法中,如果不指定 sep 参数,那么也不能指定 maxsplit 参数
合并字符串与拼接字符串不同,它会将多个字符串采用固定的分隔符连接在一起。合并字符串可以使用字符串对象的 join() 方法实现,其语法格式如下:
strnew = string.join(iterable)
strnew:表示合并后生成的新字符串;
string:字符串类型,用于指定合并时的分隔符;
iterable:可迭代对象。该迭代对象中所有的元素(字符串表示)将被合并为一个新的字符串,string 作为边界点分割出来;
示例:
list = ["马云", "马化腾", "马三立", "马克思", "马屁精"]
str = ' @'.join(list)
print("您要@的好友:" + '@' + str)
上述例子的运行结果为:您要@的好友:@马云 @马化腾 @马三立 @马克思 @马屁精
- 检索字符串
Python 中提供的一些检索字符串的方法
函数 | 功能说明 |
---|---|
count() | 用于检索指定字符串在另一个字符串中出现的次数,不存在返回 0 |
find() | 用于检索是否包含指定的子字符串,不存在返回 -1 |
index() | 也是用于检索是否包含子字符串,不存在是抛出异常 |
startswith() | 用于检索字符串是否以指定字符串开头,是返回 True,否则返回 False |
endswith() | 用于检索字符串是否以指定字符串结尾,是返回 True,否则返回 False |
示例:
str = "马云改变了我的购物方式,马化腾改变了我的交流方式,马三立提高了我的幽默感," \
"马蓉颠覆了我三观,马屁精永远是照亮仕途的一盏明灯,马赛克阻挡了我对人类文明的探索,总之姓马的都很厉害!"
test_count = str.count("马")
test_find = str.find("幽默感")
test_index = str.index("马化腾")
test_startswith = str.startswith("马")
test_endswith = str.endswith("马")
print(test_count)
print(test_find)
print(test_index)
print(test_startswith)
print(test_endswith)
上述例子的运行结果为:
7
33
12
True
False
- 字母的大小写转换
字符串对象的 lower() 方法用于将字符串中的全部大写字母转换为小写字母。而 upper() 方法用于将字符串中的全部小写字母转换为大写字母。
示例:
str = "Python - The Great Devil"
test_lower = str.lower()
print(str)
print(test_lower)
test_upper = str.upper()
print(str)
print(test_upper)
上述例子的运行结果为:
Python - The Great Devil
python - the great devil
Python - The Great Devil
PYTHON - THE GREAT DEVIL
根据上述结果我们可以得知:lower() 和 upper() 不会改变原字符串
- 去除字符串中的空格和特殊字符
用户在输入的时候,可能会无意中输入多余的空格,或在一些情况下,字符串前后不允许出现空格和特殊字符,此时就需要去除字符串中的空格和特殊字符。
这里的特殊字符是指制表符 \t、回车符 \r、换行符 \n 等
函数 | 功能说明 |
---|---|
strip() | 用于去除字符串左右两侧的空格和特殊字符 |
lstrip() | 用于去除字符串左侧的空格和特殊字符 |
rstrip() | 用于去除字符串右边的空格和特殊字符 |
示例:
str = " 人生苦短,我用 Python \t\n\r"
test_strip = str.strip()
test_lstrip = str.lstrip()
test_rstrip = str.rstrip()
print(str)
print(test_strip)
print(test_lstrip)
print(test_rstrip)
上述例子的运行结果为:
人生苦短,我用 Python
人生苦短,我用 Python
人生苦短,我用 Python
人生苦短,我用 Python
- 格式化字符串
格式化字符串的意思是先制定一个模板,在这个模板中预留几个空位,然后再根据需要填上相应的内容。这些空位需要通过指定的符号标记(也称为占位符),而这些符号不会显示出来。
可以使用 “%” 操作符实现格式化字符串,语法格式如下:
'%[-][+][0][m][.n]格式化字符'%exp
-:可选参数,用于指定左对齐,正数前面无符号,负数前面加负号;
+:可选参数,用于指定右对齐,正数前面加正号,负数前面加负号;
0:可选参数,表示右对齐,正数前面无符号,负数前面加负号,用 0 填充空白处(一般与 m 参数一起使用)
m:可选参数,表示占有宽度;
.n:可选参数,表示小数点后保留的位数;
格式化字符:用于指定类型,其值如下表:
格式字符 | 说明 | 格式字符 | 说明 |
---|---|---|---|
%s | 字符串(采用 str() 显示) | %r | 字符串(采用 repr() 显示) |
%c | 单个字符 | %o | 八进制整数 |
%d 或者 %i | 十进制整数 | %e | 指数(基底写为 e) |
%x | 十六进制整数 | %E | 指数(基底写为 E) |
%f 或者%F | 浮点数 | %% | 字符% |
exp:要转换的项。如果要指定的项有多个,需要通过元组的形式进行指定,不能使用列表;
示例:
template = "编号: %09d\t 公司名称: %s\t 官网: http://www.%s.com"
context1 = (7, "百度", "baidu")
context2 = (8, "谷歌", "google")
print(template % context1)
print(template % context2)
上述例子的运行结果为:
编号: 000000007 公司名称: 百度 官网: http://www.baidu.com
编号: 000000008 公司名称: 谷歌 官网: http://www.google.com
“%” 操作符是早期 Python 中提供的方法,自从 Python 2.6 版本开始,字符串对象提供了 format() 方法对字符串进行格式化,其语法格式如下:
str.format(args)
下面重点介绍如何创建模板,在创建模板时,需要使用 “{}” 和 “:” 指定占位符,语法如下:
{[index][ :[[fill]align][sign][#][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 位) |
示例:
template = '编号: {:0>9s}\t 公司名称: {:s}\t 官网: http://www.{:s}.com'
context1 = template.format('7', "百度", "baidu")
context2 = template.format('8', "谷歌", "google")
print(context1)
print(context2)
上述例子的运行结果为:
编号: 000000007 公司名称: 百度 官网: http://www.baidu.com
编号: 000000008 公司名称: 谷歌 官网: http://www.google.com
在实际开发中,数值类型有多种显示方式,比如货币形式、百分比形式等,使用 format() 方法可以将数值格式化为不同的形式
示例:
import math
print('1251 + 3950 的结果是(以货币形式显示):¥{:,.2f}元'.format(1251 + 3950))
print('{0:.1f} 用科学计数法表示是:{0:E}'.format(120000.1))
print('π 取 8 位小数点:{:.8f}'.format(math.pi))
print('{0:d} 的 16 进制结果是:{0:#x}'.format(100))
print('天才是由 {:.0%} 的灵感,加上 {:.0%} 的汗水'.format(0.01, 0.99))
上述例子的运行结果为:
1251 + 3950 的结果是(以货币形式显示):¥5,201.00元
120000.1 用科学计数法表示是:1.200001E+05
π 取 8 位小数点:3.14159265
100 的 16 进制结果是:0x64
天才是由 1% 的灵感,加上 99% 的汗水