python_standard_library_1_string

python 标准库学习笔记 – string

前言

今天是2019年12月20日,刚刚晴朗的天

20191220.jpg

入冬以来的第二场雪就悄然而至

20191220-1.jpg

从今天开始,坚持更新博文100天,也算是对python学习的总结。那么从哪里开始呢?

那就从python标准库开始撸吧。

操作系统 win7 sp1 64位 标准版
python版本 3.8
工具 vscode

标准库基础

在不同操作系统,标准库的路径有所不同,以windows平台为例,我的python安装在C:\Python38

标准库文件就在C:\Python38\Lib 文件夹下

标准库分为几个部分,参考标准库介绍

  • 内置函数:不需要import就可以使用的函数,例如 print

  • 内置异常

  • 内置模块

    • 文本

    • 二进制数据

    • 数据类型

    • 数学

    • 函数式编程模块

    • 文件和目录访问

    • 数据持久化

    • 文件格式

    • 加密服务

    • 并发执行

    • 网络和进程间通信

    • 互联网数据处理

    • 互联网协议和支持

    • 多媒体服务

    • 国际化

    • 程序框架

    • Tk图形用户界面

    • 开发工具

    • 调试和分析

    • 软件打包和分发

    • python运行时服务

    • 自定义python解释器

    • 导入模块

    • Python语言服务

    • 杂项服务

    • Windows系统相关模块

    • Unix专有服务

    • 被取代的模块

day1 标准库 string

参考:文本处理服务 string常见字符串操作

字符串常量

1
2
3
__all__ = ["ascii_letters", "ascii_lowercase", "ascii_uppercase", "capwords",
"digits", "hexdigits", "octdigits", "printable", "punctuation",
"whitespace", "Formatter", "Template"]

测试如下:

1
2
3
4
5
6
7
8
9
10
11
12
import string
print(string.__all__)

print(string.ascii_letters) #abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.ascii_lowercase) #abcdefghijklmnopqrstuvwxyz
print(string.ascii_uppercase) #ABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.digits)# 十进制数字常数 0123456789
print(string.hexdigits)#十六进制数字常数 0123456789abcdefABCDEF
print(string.octdigits)#八进制数字常数 01234567
print(string.punctuation)
print(string.printable)
print(string.whitespace)

其中:

  • string.whitespace :由被视为空白符号的 ASCII 字符组成的字符串。 其中包括空格、制表、换行、回车、进纸和纵向制表符。

自定义字符串格式化

主要函数 功能
format(format_string, *args, **kwargs) 它采用格式字符串和一组任意位置和关键字参数。它只是一个调用vformat()的包装器。
vformat(format_string, args, kwargs) 执行格式化的实际工作
parse(format_string) 循环遍历format_string并返回一个可迭代的元组(literal_text,field_name,format_spec,conversion)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

data = ("Pi = ",3.1415926)
strtmp = "This is a test:{}{:.4f}"
formatter = string.Formatter()
strtmp = formatter.vformat(strtmp,data,{})
print(strtmp) #This is a test:{}{:.4f}

data ={"key1":3.1415926,"key2":"Pi: ="}
strtmp = "This is a test:{key2}{key1}"
formatter = string.Formatter()
strtmp = formatter.vformat(strtmp,(),data)
print(strtmp)
import string

data = ("Pi=",3.1415926)
strtmp = "This is a test:{}{:.4f}"
formatter = string.Formatter()
formatter.vformat(strtmp,data,{})
print(strtmp) #This is a test:{}{:.4f}


data ={"key1":3.1415926,"key2":"Pi: ="}
strtmp = "This is a test:{key2}{key1}"
formatter = string.Formatter()
strtmp = formatter.vformat(strtmp,(),data)
print(strtmp)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import string
strtmp = "This is a test:{}{:.4f}"
formatter = string.Formatter()
strtuple = formatter.parse(strtmp)

for i, v in enumerate(strtuple):
print(i, v)
'''
0 ('This is a test:', '', '', None)
1 ('', '', '.4f', None)
'''
strtmp = "This is a test:{Key2}{Key1}"
formatter = string.Formatter()
strtuple = formatter.parse(strtmp)

for i, v in enumerate(strtuple):
print(i, v)
'''
0 ('This is a test:', 'Key2', '', None)
1 ('', 'Key1', '', None)
'''
# string.Formatter.parse(format_string) End

格式化字符串范例

按位置访问参数

1
2
3
4
5
6
7
8
9
tupdata = ("This","is","a","test") # 元组
formatstr = '{0} {1} {2} {3}'.format("This","is","a","test")
print(formatstr) # This is a test
formatstr = '{} {} {} {}'.format(*tupdata) # *data 解包参数序列
print(formatstr) # This is a test
formatstr = '{3} {2} {1} {0}'.format(*tupdata) # *data 解包参数序列
print(formatstr) # test a is This
formatstr = '{2} {3} {1} {2} {3}'.format(*tupdata) # 参数可以重复
print(formatstr) # a test is a test

按关键字访问参数

1
2
3
4
5
dicdata = {'Author':'leacoder','Time':'2019/04/17'}
formatstr = 'The author is {Author},The time is {Time}'.format(Author='leacoder',Time='2019/04/17')
print(formatstr) # The author is leacoder,The time is 2019/04/17
formatstr = 'The author is {Author},The time is {Time}'.format(**dicdata)
print(formatstr) # The author is leacoder,The time is 2019/04/17

访问参数的属性

1
2
3
4
5
6
7
8
class Point:
def __init__(self,x,y):
self.x ,self.y = x, y
point = Point(4,2)
formatstr = 'Thie point is ({key.x},{key.y})'.format(key = point) # key 可为其他
print(formatstr) # Thie point is (4,2)
formatstr = 'Thie point is ({point.x},{point.y})'.format(point = point) # point 可为其他
print(formatstr) # Thie point is (4,2)

访问参数的各项

1
2
3
4
5
tupdata = ("leacoder","2019/04/17") # 元组
formatstr = 'The author is {0[0]},The time is {0[1]}'.format(tupdata)
print(formatstr) # The author is leacoder,The time is 2019/04/17
formatstr = 'The author is {0[0]},The time is {0[1]}'.format(*tupdata) # 注意区别
print(formatstr) # The author is l,The time is e

对齐文本并指定宽度

1
2
3
4
5
6
7
8
formatstr = '{:<30}'.format('left aligned') # 左对齐 30位
print(formatstr) # ‘left aligned ’ 为了体现位数加了‘’
formatstr = '{:>30}'.format('right aligned') # 右对齐 30位
print(formatstr) # ‘ right aligned’
formatstr = '{:^30}'.format('centered') # 中间对齐 30位
print(formatstr) # ‘ centered ’
formatstr = '{:*^30}'.format('centered') # 使用* 作为填充字符
print(formatstr) # ‘***********centered***********’

Replacing %+f, %-f, and % f and specifying a sign: 替换%+ f,% - f和%f并指定符号:

1
2
3
4
5
6
formatstr = '{:+f}; {:+f}'.format(3.14, -3.14)  # 总是显示它符号
print(formatstr) # ‘+3.140000; -3.140000’
formatstr = '{: f}; {: f}'.format(3.14, -3.14) # 正数前显示空格
print(formatstr) # ‘ 3.140000; -3.140000’
formatstr = '{:-f}; {:-f}'.format(3.14, -3.14) # 只显示负号 同 '{:f}; {:f}'
print(formatstr) # ‘3.140000; -3.140000’

Replacing %x and %o and converting the value to different bases: 替换%x和%o并将值转换为不同的进制

1
2
3
4
5
6
formatstr = "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(64)
print(formatstr) # int: 64; hex: 40; oct: 100; bin: 1000000
formatstr = "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(64)
print(formatstr) # int: 64; hex: 0x40; oct: 0o100; bin: 0b1000000
formatstr = "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(0b1000001) # 也支持其他进制
print(formatstr) # int: 65; hex: 0x41; oct: 0o101; bin: 0b100000

使用逗号作为千位分隔符

1
2
3
4
points = 1
total = 3
formatstr = 'points / total = {:.2%}'.format(points/total)
print(formatstr) # points / total = 33.33%

使用特定类型的格式

1
2
3
4
import datetime
d = datetime.datetime(2019, 4, 17, 22, 49, 2) # 2019/04/17 22:49:02
formatstr = '{:%Y-%m-%d %H:%M:%S}'.format(d)
print(formatstr) # 2019-04-17 22:49:02

模板字符串

模板字符串规则

1
2
3
4
5
6
7
8
9
10
'''
模板字符串提供更简单的字符串替换,如PEP 292中所述 https://www.python.org/dev/peps/pep-0292/
模板字符串支持基于$的替换,使用以下规则:
1、$$是转义; 它被替换为单个$。
2、$identifier 一个替换占位符,用于匹配映射关键字“identifier”默认情况下,
“标识符”仅限于以下划线或ASCII字母开头的任何不区分大小写的ASCII字母数字字符串(包括下划线)。$字符后面的第一个非标识符字符结束此占位符。
3、$ {identifier}相当于$ identifier。当有效标识符字符跟随占位符但不是占位符的一部分时,例如“$ {noun} ification”,则需要它。
4、字符串中$的任何其他形式都将导致引发ValueError。
字符串模块提供实现这些规则的Template类。class string.Template(template)
'''

class string.`Template`(template)

substitute(mapping,**kwargs)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'''
执行模板替换,返回一个新字符串。 mapping 为任意字典类对象,其中的键将匹配模板中的占位符。 或者你也可以提供一组关键字参数,其中的关键字即对应占位符。 当同时给出 mapping 和 kwds 并且存在重复时,则以 kwds 中的占位符为优先
'''
s = Template('The Author is $Author, The Time is $Time') # 使用Template类构造函数
kewds = {'Author':'leacoder', 'Time':'2019/04/18 00:01:38'}
templatestr = s.substitute(Author='leacoder', Time='2019/04/18 00:01:38') # **kewds
print(templatestr) # The Author is leacoder, The Time is 2019/04/18 00:01:38
templatestr = s.substitute(**kewds) # **kewds
print(templatestr) # The Author is leacoder, The Time is 2019/04/18 00:01:38
templatestr = s.substitute(kewds) # mapping
print(templatestr) # The Author is leacoder, The Time is 2019/04/18 00:01:38
templatestr = s.substitute(kewds,Author='250',Time = 'No Time') # mapping **kewds
print(templatestr) # The Author is 250, The Time is No Time

kewds1 = {'Author':'leacoder'}
templatestr = s.substitute(kewds1)
print(templatestr) # KeyError: 'Time'
# substitute(mapping, **kwds) End

safe_substitute(mapping, **kwds)

1
2
3
4
5
6
7
8
'''
类似于 substitute(),不同之处是如果有占位符未在 mapping 和 kwds 中找到,不是引发 KeyError 异常,而是将原始占位符不加修改地显示在结果字符串中。 另一个与 substitute() 的差异是任何在其他情况下出现的 $ 将简单地返回 $ 而不是引发 ValueError。
'''
# safe_substitute(mapping, **kwds)
kewds1 = {'Author':'leacoder'}
templatestr = s.safe_substitute(kewds1)
print(templatestr) # The Author is leacoder, The Time is $Time
# safe_substitute(mapping, **kwds) End

辅助函数

string.`capwords`(s, sep=None

1
2
3
'''
使用 str.split() 将参数拆分为单词,使用 str.capitalize() 将单词转为大写形式,使用 str.join() 将大写的单词进行拼接。 如果可选的第二个参数 sep 被省略或为 None,则连续的空白字符会被替换为单个空格符并且开头和末尾的空白字符会被移除,否则 sep 会被用来拆分和拼接单词
'''
坚持原创技术分享,您的支持将鼓励我继续创作!