一、sys模块用法详解
下面程序示范了使用 sys 模块的部分功能:
import sys
# 显示本地字节序的指示符。
print(sys.byteorder)
# 显示Python解释器有关的版权信息
print(sys.copyright)
# 显示Python解释器在磁盘上的存储路径。
print(sys.executable)
# 显示当前系统上保存文件所用的字符集。
print(sys.getfilesystemencoding())
# 显示Python整数支持的最大值
print(sys.maxsize)
# 显示Python解释器所在平台
print(sys.platform)
# 显示当前Python解释器的版本信息。
print(sys.version)
# 返回当前Python解释器的主版本号。
print(sys.winver)
二、os模块及用法
下面程序示范了在 os 模块中与进程管理相关的函数的功能:
import os
# 运行平台上的cmd命令
os.system(‘cmd’)
# 使用Excel打开g:\abc.xls文件
os.startfile('g:\\abc.xls')
os.spawnl(os.P_NOWAIT, 'E:\\Tools\\编辑工具\\Notepad++.7.5.6.bin.x64\\notepad++.exe', ' ')
# 使用python命令执行os_test.py程序
os.execl("D:\\Python\\Python36\\python.exe", " ", 'os_test.py', 'i')
如果直接运行上面程序,可以看到程序运行后使用 Excel 打开了 abe.xls 文件,也打开了 Notepad++ 工具,还使用 python 命令运行了 os_test.py 文件。
但如果将程序中os.system(‘cmd’)取消注释,将看到程序运行后只是启动了 cmd 命令行程序,这是因为使用 os.system() 函数来运行程序时,新程序所在的进程会替代原有的进程。
在使用 os.execl() 函数时新进程之后,也会取代原有的进程,因此上面程序将这行代码放在了最后。
-
os.execl(“D:\Python\Python36\python.exe”, " ", ‘os_test.py’, ‘i’)
**‘l’和‘v’**代表传入命令行的参数设置情况,'l’代表固定个数的命令行参数,传入时,分别以arg0,arg1…的形式,而’v’代表不定个数的命令行参数,传入时,以args(列表或者元组)的形式。 -
os.spawnl(os.P_NOWAIT, ‘E:\Tools\编辑工具\Notepad++.7.5.6.bin.x64\notepad++.exe’, ’ ')
去除空格
三、random模块及用法
import random
#生成范围为0.0≤x<1.0 的伪随机浮点数
print (random.random())
#生成范围为2.5≤x<10.0 的伪随机浮点数
print (random.uniform(2.5, 10.0))
#生成呈指数分布的伪随机浮点数
print (random.expovariate(1/5))
#生成从0 到9 的伪随机整数
print(random.randrange(10))
#生成从0 到100 的随机偶数
print (random.randrange(0, 101 , 2))
#随机抽取一个元素
print (random.choice (['Python','Swift','Kotlin']))
book_list = ['Python','Swift','Kotlin']
#对列表元素进行随机排列
random.shuffle (book_list)
print (book_list)
#随机抽取4 个独立的元素
print (random.sample([10, 20 , 30 , 40 , 50], k=4))
#指定随机抽取6 个元素,各元素被抽取的权重(概率)不同
print(random.choices(['Python','Swift','Kotlin'], [5, 5, 1], k=6))
四、time模块详解
在 time 模块内提供了一个 time.struct_time 类,该类代表一个时间对象,它主要包含 9 个属性,每个属性的信息如表 1 所示:
在日期、时间模块内常用的功能函数如表 1 所示。
time.asctime ----------- struct_time======》字符串
tiem.ctime -----------秒数============》字符串
time.localtime -----------秒数============》struct_time
time.mktime -----------反转
time.strftime(formt[,t]) ------------将struct_time=========》字符串
time.strptime(string[,format]) -------将字符串============》struct_time
五、JSON 的基本知识
JSON 主要有如下两种数据结构:
1.由 key-value 对组成的数据结构。这种数据结构在不同的语言中有不同的实现。例如,在 JavaScript 中是一个对象;在 Python 中是一种 dict 对象;在 C 语言中是一个 struct;在其他语言中,则可能是 record、dictionary、hash table 等。
2/有序集合。这种数据结构在 Python 中对应于列表;在其他语言中,可能对应于 list、vector、数组和序列等。
json 模块中常用的函数和类的功能如下:
1.json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw):将 obj 对象转换成 JSON 字符串输出到 fp 流中,fp 是一个支持 write() 方法的类文件对象。
# 指定indent为4,意味着转换的JSON字符串有缩进
s6 = json.dumps({'Python': 5, 'Kotlin': 7}, sort_keys=True, indent=4)
s6的结果:
{
"Kotlin": 7,
"Python": 5
}
2.json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan= True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw):将 obj 对象转换为 JSON 字符串,并返回该JSON 字符串。
f = open('a.json', 'w')
# 使用dump()函数将转换得到JSON字符串输出到文件
json.dump(['Kotlin', {'Python': 'excellent'}], f)
3.json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):从 fp 流读取 JSON 字符串,将其恢复成 JSON 对象,其中 fp 是一个支持 write() 方法的类文件对象。
# 将JSON字符串恢复成Python列表
result1 = json.loads('["yeeku", {"favorite": ["coding", null, "game", 25]}]')
print(result1) # ['yeeku', {'favorite': ['coding', None, 'game', 25]}]
#loads 加载的字符串必须用双引号。loads内的JSON字符串用单引号。
result2 = json.loads('"\\"foo\\"bar"')
print(result2) # "foo"bar
4.json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):将 JSON 字符串 s 恢复成 JSON 对象。
f = open('a.json')
# 从文件流恢复JSON列表
result4 = json.load(f)
六、re正则表达式模块及其用法
re.compile(pattern, flags=0): _
该函数用于将正则表达式字符串编译成 _sre.SRE_Pattern 对象,该对象代表了正则表达式编译之后在内存中的对象,它可以缓存并复用正则表达式字符串。如果程序需要多次使用同一个正则表达式字符串,则可考虑先编译它。
re.match(pattern, string, flags=0):
尝试从字符串的开始位置来匹配正则表达式,如果从开始位置匹配不成功,match() 函数就返回 None 。其中 pattern 参数代表正则表达式;string 代表被匹配的字符串;flags 则代表正则表达式的匹配旗标。该函数返回 _sre.SRE_Match 对象,该对象包含的 span(n) 方法用于获取第 n+1 个组的匹配位置,group(n) 方法用于获取第 n+1 个组所匹配的子串。
re.search(pattern, string, flags=0):扫描整个字符串,并返回字符串中第一处匹配 pattern 的匹配对象。
根据上面介绍不难发现,match() 与 search() 的区别在于,match() 必须从字符串开始处就匹配,但 search() 可以搜索整个字符串。
import re
m1 = re.match('www', 'www.fkit.org')# 开始位置可以匹配
print(m1.span()) # span返回匹配的位置
print(m1.group()) # group返回匹配的组
print(re.match('fkit', 'www.fkit.com')) # 开始位置匹配不到,返回None
m2 = re.search('www', 'www.fkit.org') # 开始位置可以匹配
print(m2.span())
print(m2.group())
m3 = re.search('fkit', 'www.fkit.com') # 中间位置可以匹配,返回Match对象
print(m3.span())
print(m3.group())
运行上面程序,可以看到如下输出结果:
(0, 3)
www
None
(0, 3)
www
(4, 8)
fkit
re.findall(pattern, string, flags=0):扫描整个字符串,并返回字符串中所有匹配 pattern 的子串组成的列表。
re.finditer(pattern, string, flags=0):扫描整个字符串,并返回字符串中所有匹配 pattern 的子串组成的迭代器,迭代器的元素是 _sre.SRE_Match 对象。
import re
# 返回所有匹配pattern的子串组成的列表, 忽略大小写
print(re.findall('fkit', 'FkIt is very good , Fkit.org is my favorite' , re.I))
# 返回所有匹配pattern的子串组成的迭代器, 忽略大小写
it = re.finditer('fkit', 'FkIt is very good , Fkit.org is my favorite' , re.I)
for e in it:
print(str(e.start()) + "-->" + e.group())
re.fullmatch(pattem, string, flags=0):该函数要求整个字符串能匹配 pattern,如果匹配则返回包含匹配信息的 _sre.SRE_Match 对象;否则返回 None。
re.sub(pattern, repl, string, count=0, flags=0):该函数用于将 string 字符串中所有匹配 pattern 的内容替换成 repl;repl 既可是被替换的字符串,也可是一个函数。count 参数控制最多替换多少次,如果指定 count 为 0 ,则表示全部首换。如下程序示范了 sub() 函数的简单用法:
import re
my_date = '2008-08-18'
# 将my_date字符串里中画线替换成斜线
print(re.sub(r'-', '/' , my_date))
# 将my_date字符串里中画线替换成斜线,只替换一次
print(re.sub(r'-', '/' , my_date, 1))
运行上面程序,可以看到如下输出结果:
2008/08/18
2008/08-18
在某些情况下,所执行的替换要基于被替换内容进行改变。比如下面程序需要将字符串中的每个英文单词都变成一套教程的名字:
纯文本复制
# 在匹配的字符串前后添加内容
def fun(matched):
# matched就是匹配对象,通过该对象的group()方法可获取被匹配的字符串
value = "《基础" + (matched.group('lang')) + "教程》"
return value
s = 'Python很好,Kotlin也很好'
# 将s里面的英文单词(用re.A旗标控制)进行替换
# 使用fun函数指定替换的内容
print(re.sub(r'(?P<lang>\w+)', fun, s, flags=re.A))
上面程序使用 sub() 函数执行替换时,指定使用 fun() 函数作为替换内容,而 fun() 函数则负责在 pattern 匹配的字符串之前添加“《基础”,在 pattern 匹配的字符串之后添加“教程》”。
运行上面程序,可以看到如下输出结果:
《基础Python教程》很好,《基础Kotlin教程》也很好
其中 r 代表原始字符串,通过使用原始字符串,可以避免对字符串中的特殊字符进行转义。
re.split(pattem, string, maxsplit=0, flags=0):使用 pattern 对 string 进行分割,该函数返回分割得到的多个子串组成的列表。其中 maxsplit 参数控制最多分割几次。如下程序示范了 split() 函数的用法:
import re
# 使用逗号对字符串进行分割
print(re.split(', ', 'fkit, fkjava, crazyit'))
# 输出:['fkit', 'fkjava', 'crazyit']
# 指定只分割1次,被切分成2个子串
print(re.split(', ', 'fkit, fkjava, crazyit', 1))
# 输出:['fkit', 'fkjava, crazyit']
# 使用a进行分割
print(re.split('a', 'fkit, fkjava, crazyit'))
# 输出:['fkit, fkj', 'v', ', cr', 'zyit']
# 使用x进行分割,没有匹配内容,则不会执行分割
print(re.split('x', 'fkit, fkjava, crazyit'))
# 输出:['fkit, fkjava, crazyit']
1.re.purge():清除正则表达式缓存。
2.re.escape(pattern):对模式中除 ASCII 字符、数值、下画线(_)之外的其他字符进行转义。如下程序示范了 escape() 函数的用法:
import re
# 对模式中特殊字符进行转义
print(re.escape(r'www.crazyit.org is good, i love it!'))
# 输出:www\.crazyit\.org\ is\ good\,\ i\ love\ it\!
print(re.escape(r'A-Zand0-9?'))
# 输出:A\-Zand0\-9\?
在 re 模块中还包含两个类,它们分别是正则表达式对象(其具体类型为 _sre.SRE_Pattern)和匹配(Match)对象,其中正则表达式对象就是调用 re.compile() 函数的返回值。该对象的方法与前面介绍的 re 模块中的函数大致对应。
相比之下,正则表达式对象的 search()、match()、fullmatch()、findall()、finditer() 方法的功能更强大一些,因为这些方法都可额外指定 pos 和 endpos 两个参数,用于指定只处理目标字符串从 pos 开始到 endpos 结束之间的子串。
见http://c.biancheng.net/view/2427.html