sys模块官方文档: https://docs.python.org/3/library/sys.html
例:
from sys import argv
# 输出argv列表的长度
print(len(argv))
# 遍历argv列表的每个元素
for arg in argv:
print(arg)
如果使用python3 test.py Lethe Python 命令运行该脚本,则结果为:
3
test.py
Lethe
Python
sys.path 也是很有用的一个属性,它可用于在程序运行时为 Python 动态修改模块加载路径。例如,如下程序在运行时动态指定加载 E:\Lethe
目录下的模块:
import sys
# 动态添加g:\fk_ext路径作为模块加载路径
sys.path.append('E:\\Lethe')
# 加载g:\fk_ext路径下的hello模块
import hello
os模块官方文档:https://docs.python.org/3/library/os.html。
除此之外,os.path 模块下提供了一些操作目录的方法,这些函数可以操作系统的目录本身。
import os
import time
# 获取绝对路径
print(os.path.abspath("abc.txt")) # G:\publish\codes\12\12.2\abc.txt
# 获取共同前缀
print(os.path.commonprefix(['/usr/lib', '/usr/local/lib'])) # /usr/l
# 获取共同路径
print(os.path.commonpath(['/usr/lib', '/usr/local/lib'])) # \usr
# 获取目录
print(os.path.dirname('abc/xyz/README.txt')) #abc/xyz
# 判断指定目录是否存在
print(os.path.exists('abc/xyz/README.txt')) # False
# 获取最近一次访问时间
print(time.ctime(os.path.getatime('os.path_test.py')))
# 获取最后一次修改时间
print(time.ctime(os.path.getmtime('os.path_test.py')))
# 获取创建时间
print(time.ctime(os.path.getctime('os.path_test.py')))
# 获取文件大小
print(os.path.getsize('os.path_test.py'))
# 判断是否为文件
print(os.path.isfile('os.path_test.py')) # True
# 判断是否为目录
print(os.path.isdir('os.path_test.py')) # False
# 判断是否为同一个文件
print(os.path.samefile('os.path_test.py', './os.path_test.py')) # True
在 os 模块下与进程管理相关的函数如下:
os.abort():生成一个 SIGABRT 信号给当前进程。在 UNIX 系统上,默认行为是生成内核转储;在 Windows 系统上,进程立即返回退出代码 3。
os.execl(path, arg0, arg1, …):该函数还有一系列功能类似的函数,比如 os.execle()、os.execlp() 等,这些函数都是使用参数列表 arg0, arg1,…来执行 path 所代表的执行文件的。
由于 os.exec*() 函数都是 PosIX 系统的直接映射,因此如采使用该命令来执行 Python 程序,传入的 arg0 参数没有什么作用。os._exit(n) 用于强制退出 Python 解释器。将其放在 try 决中可以阻止 finally 块的执行。
os.forkpty():fork一个子进程。
os.kill(pid, sig):将 sig 信号发送到 pid 对应的过程,用于结束该进程。
os.killpg(pgid, sig):将 sig 信号发送到 pgid 对应的进程组。
os.popen(cmd, mode=‘r’, buffering=-1):用于向 cmd 命令打开读写管道(当 mode 为 r 时为只读管道,当 mode 为 rw 时为读写管道),buffering 缓冲参数与内置的 open() 函数有相同的含义。该函数返回的文件对象用于读写字符串,而不是字节。
os.spawnl(mode, path, …):该函数还有一系列功能类似的函数,比如 os.spawnle()、os.spawnlp() 等,这些函数都用于在新进程中执行新程序。
os.startfile(path[,operation]):对指定文件使用该文件关联的工具执行 operation 对应的操作。如果不指定 operation 操作,则默认执行打开(open)操作。operation 参数必须是有效的命令行操作项目,比如 open(打开)、edit(编辑)、print(打印)等。
os.system(command):运行操作系统上的指定命令。
random模块官方文档:https://docs.python.org/3/library/random.html
在 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))
time模块官方文档:https://docs.python.org/zh-cn/3/library/time.html#module-time
在日期、时间模块内常用的功能函数如下:
time.asctime([t]):将时间元组或 struct_time 转换为时间字符串。如果不指定参数 t,则默认转换当前时间。
time.ctime([secs]):将以秒数代表的时间转换为时间宇符串。
Python 可以用从 1970 年 1 月 1 日 0 点整到现在所经过的秒数来代表当前时间,比如我们写 30 秒,那么意味着时间是 1970 年 1 月 1 日 0 点 0 分 30 秒。但需要注意的是,在实际输出时可能会受到时区的影响,比如中国处于东八区,因此实际上会输出 1970 年 1 月 1 日 8 点 0 分 30 秒。
time.gmtime([secs]):将以秒数代表的时间转换为 struct_time 对象。如果不传入参数,则使用当前时间。
time.localtime([secs]):将以秒数代表的时间转换为代表当前时间的 struct_time 对象。如果不传入参数,则使用当前时间。
time.mktime(t):它是 localtime 的反转函数,用于将 struct_time 对象或元组代表的时间转换为从 1970 年 1 月 1 日 0 点整到现在过了多少秒。
time.perf_counter():返回性能计数器的值。以秒为单位。
time.process_time():返回当前进程使用 CPU 的时间。以秒为单位。
time.sleep(secs):暂停 secs 秒,什么都不干。
time.strftime(format[, t]):将时间元组或 struct_time 对象格式化为指定格式的时间字符串。如果不指定参数 t,则默认转换当前时间。
time.strptime(string[, format]):将字符串格式的时间解析成 struct_time 对象。
time.time():返回从 1970 年 1 月 1 日 0 点整到现在过了多少秒。
time.timezone:返回本地时区的时间偏移,以秒为单位。
time.tzname:返回本地时区的名字。
例:
import time
# 将当前时间转换为时间字符串
print(time.asctime())
# 将指定时间转换时间字符串,时间元组的后面3个元素没有设置
print(time.asctime((2018, 2, 4, 11, 8, 23, 0, 0 ,0))) # Mon Feb 4 11:08:23 2018
# 将以秒数为代表的时间转换为时间字符串
print(time.ctime(30)) # Thu Jan 1 08:00:30 1970
# 将以秒数为代表的时间转换为struct_time对象。
print(time.gmtime(30))
# 将当前时间转换为struct_time对象。
print(time.gmtime())
# 将以秒数为代表的时间转换为代表当前时间的struct_time对象
print(time.localtime(30))
# 将元组格式的时间转换为秒数代表的时间
print(time.mktime((2018, 2, 4, 11, 8, 23, 0, 0 ,0))) # 1517713703.0
# 返回性能计数器的值
print(time.perf_counter())
# 返回当前进程使用CPU的时间
print(time.process_time())
time.sleep(10) # 暂停10s
# 将当前时间转换为指定格式的字符串
print(time.strftime('%Y-%m-%d %H:%M:%S'))
st = '2018年3月20日'
# 将指定时间字符串恢复成struct_time对象。
print(time.strptime(st, '%Y年%m月%d日'))
# 返回从1970年1970年1月1日0点整到现在过了多少秒。
print(time.time())
# 返回本地时区的时间偏移,以秒为单位
print(time.timezone) # 在国内东八区输出-28800
json模块官方文档:https://docs.python.org/zh-cn/3/library/json.html#module-json
Python 类型转换 JSON 类型的对应关系:
json 模块中常用的函数和类的功能如下:
dumps() 和 dump() 函数的 encode 操作(将 Python 对象转换成 JSON 字符串):
import json
# 将Python对象转JSON字符串(元组会当成数组)
s = json.dumps(['yeeku', {'favorite': ('coding', None, 'game', 25)}])
print(s) # ["yeeku", {"favorite": ["coding", null, "game", 25]}]
# 简单的Python字符串转JSON
s2 = json.dumps("\"foo\bar")
print(s2) #"\"foo\bar"
# 简单的Python字符串转JSON
s3 = json.dumps('\\')
print(s3) #"\\"
# Python的dict对象转JSON,并对key排序
s4 = json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
print(s4) #{"a": 0, "b": 0, "c": 0}
# 将Python列表转JSON,
# 并指定JSON分隔符:逗号和冒号之后没有空格(默认有空格)
s5 = json.dumps([1, 2, 3, {'x': 5, 'y': 7}], separators=(',', ':'))
# 输出的JSON字符串中逗号和冒号之后没有空格
print(s5) # '[1,2,3,{"4":5,"6":7}]'
# 指定indent为4,意味着转换的JSON字符串有缩进
s6 = json.dumps({'Python': 5, 'Kotlin': 7}, sort_keys=True, indent=4)
print(s6)
# 使用JSONEncoder的encode方法将Python转JSON
s7 = json.JSONEncoder().encode({"names": ("孙悟空", "齐天大圣")})
print(s7) # {"names": ["\u5b59\u609f\u7a7a", "\u9f50\u5929\u5927\u5723"]}
f = open('a.json', 'w')
# 使用dump()函数将转换得到JSON字符串输出到文件
json.dump(['Kotlin', {'Python': 'excellent'}], f)
loads() 和 load() 函数的 decode 操作(将 JSON 字符串转换成 Python 对象):
import json
# 将JSON字符串恢复成Python列表
result1 = json.loads('["yeeku", {"favorite": ["coding", null, "game", 25]}]')
print(result1) # ['yeeku', {'favorite': ['coding', None, 'game', 25]}]
# 将JSON字符串恢复成Python字符串
result2 = json.loads('"\\"foo\\"bar"')
print(result2) # "foo"bar
# 定义一个自定义的转化函数
def as_complex(dct):
if '__complex__' in dct:
return complex(dct['real'], dct['imag'])
return dct
# 使用自定义的恢复函数
# 自定义回复函数将real数据转成复数的实部,将imag转成复数的虚部
result3 = json.loads('{"__complex__": true, "real": 1, "imag": 2}',\
object_hook=as_complex)
print(result3) # (1+2j)
f = open('a.json')
# 从文件流恢复JSON列表
result4 = json.load(f)
print(result4) # ['Kotlin', {'Python': 'excellent'}]
re模块官方文档:https://docs.python.org/zh-cn/3/library/re.html#module-re
match() 与 search() 的区别在于,match() 必须从字符串开始处就匹配,但 search() 可以搜索整个字符串。例如如下程序:
import re
m1 = re.match('www', 'www.lethe.site')# 开始位置可以匹配
print(m1.span()) # span返回匹配的位置
print(m1.group()) # group返回匹配的组
print(re.match('lethe', 'www.lethe.site')) # 开始位置匹配不到,返回None
m2 = re.search('www', 'www.lethe.site') # 开始位置可以匹配
print(m2.span())
print(m2.group())
m3 = re.search('lethe', 'www.lethe.site') # 中间位置可以匹配,返回Match对象
print(m3.span())
print(m3.group())
运行结果:
(0, 3)
www
None
(0, 3)
www
(4, 9)
lethe
对比 findall()、finditer() 和 search() 函数,search() 只返回字符串中第一处匹配 pattern 的子串;而 findall() 和 finditer() 则返回字符串中所有匹配 pattern 的子串。
re 模块中的 Match 对象(其具体类型为 _sre.SRE_Match)则是 match()、search() 方法的返回值,该对象中包含了详细的正则表达式匹配信息,包括正则表达式匹配的位置、正则表达式所匹配的子串。
sre.SRE_Match 对象包含了如下方法或属性: