Python 常用模块
在 Python 编程中,模块是代码复用和功能扩展的重要方式。本文将详细介绍 Python 中一些常用的模块,包括时间处理、随机数生成、文件操作、数据序列化、日志记录等,帮助你快速掌握这些模块的使用方法,提升编程效率。
一、Time 模块:时间处理的利器
Time 模块提供了处理时间的各种功能,主要包括时间戳、格式化时间和结构化时间三种时间表示方式。
1. 时间戳
时间戳是从 1970 年 1 月 1 日 00:00:00 开始到现在的秒数,是一个浮点数。
import time
time_stamp = time.time()
print(time_stamp, type(time_stamp)) # 输出类似:1729987200.123456 <class 'float'>
2. 格式化时间
格式化时间是将时间按照指定的格式转换为字符串,方便阅读和展示。
format_time = time.strftime("%Y-%m-%d %X")
print(format_time, type(format_time)) # 输出类似:2024-10-25 15:30:45 <class 'str'>
其中,%Y
表示年份,%m
表示月份,%d
表示日期,%X
表示时间(包含时、分、秒)。
3. 结构化时间
结构化时间是一个包含年、月、日、时、分、秒等信息的元组,便于对时间的各个部分进行操作。
print('本地时区的struct_time:\n{}'.format(time.localtime()))
print('UTC时区的struct_time:\n{}'.format(time.gmtime()))
输出结果类似:
本地时区的struct_time:
time.struct_time(tm_year=2024, tm_mon=10, tm_mday=25, tm_hour=15, tm_min=32, tm_sec=10, tm_wday=4, tm_yday=299, tm_isdst=0)
UTC时区的struct_time:
time.struct_time(tm_year=2024, tm_mon=10, tm_mday=25, tm_hour=7, tm_min=32, tm_sec=10, tm_wday=4, tm_yday=299, tm_isdst=0)
4. 常见用法:计算程序执行时间
通过记录程序开始和结束的时间戳,可计算程序的执行时间。
start = time.time()
time.sleep(3) # 暂停 3 秒
end = time.time()
print(end - start) # 输出约为 3.0
二、datetime 模块:更便捷的时间加减
datetime 模块在 time 模块的基础上提供了更直观的时间操作,尤其适合进行时间的加减运算。
import datetime# 获取当前时间
print(datetime.datetime.now()) # 输出类似:2024-10-25 15:35:20.123456# 时间加减
print(datetime.datetime.now() + datetime.timedelta(3)) # 当前时间 + 3 天
print(datetime.datetime.now() + datetime.timedelta(-3)) # 当前时间 - 3 天
print(datetime.datetime.now() + datetime.timedelta(minutes=30)) # 当前时间 + 30 分钟# 时间替换
c_time = datetime.datetime.now()
print(c_time.replace(minute=20, hour=5, second=13)) # 将时间替换为指定的时、分、秒# 时间戳转换为日期
print(datetime.date.fromtimestamp(time.time())) # 输出类似:2024-10-25
三、random 模块:随机数生成
random 模块用于生成各种随机数,在游戏、抽样、加密等场景中广泛应用。
import random# 生成 0-1 之间的随机小数
print(random.random()) # 输出类似:0.67891234# 生成指定范围内的随机整数(包含端点)
print(random.randint(1, 3)) # 可能输出 1、2 或 3# 生成指定范围内的随机小数
print(random.uniform(1, 3)) # 输出类似:1.927109612082716# 从列表中随机选择一个元素
print(random.choice([1, '23', [4, 5]])) # 可能输出 1、'23' 或 [4,5]# 从列表中随机选择指定数量的元素(不重复)
print(random.sample([1, '23', [4, 5]], 2)) # 输出类似:[[4, 5], '23']# 打乱列表顺序(原地操作)
lis = [1, 3, 5, 7, 9]
random.shuffle(lis)
print(lis) # 输出类似:[1, 9, 3, 7, 5]
四、os 模块:与操作系统交互
os 模块提供了与操作系统进行交互的功能,如文件路径操作、目录管理等。
1. 常用路径操作
import os# 获取当前文件的绝对路径(包含文件名)
print(os.path.abspath(__file__))# 获取当前文件的父路径
print(os.path.dirname(os.path.abspath(__file__)))# 获取当前文件的父父路径
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))# 分割路径和文件名
print(os.path.split('C:\\WINDOWS\\system32\\cmd.exe')) # 输出:('C:\\WINDOWS\\system32', 'cmd.exe')# 拼接路径
print(os.path.join('C:\\WINDOWS\\system32', 'hello')) # 输出:'C:\\WINDOWS\\system32\\hello'# 获取文件大小(字节)
print(os.path.getsize('C:\\WINDOWS\\system32\\cmd.exe'))
五、sys 模块:与 Python 解释器交互
sys 模块用于与 Python 解释器进行交互,获取解释器相关信息或控制解释器行为。
1. 常用功能
sys.path
:返回模块的搜索路径,初始化时使用 PYTHONPATH 环境变量的值。sys.version
:获取 Python 解释器的版本信息。sys.exit(n)
:退出程序,正常退出时使用exit(0)
。
2. 实战案例:实现进度条
import sys
import timedef progress(percent, width=100):if percent >= 1:percent = 1show_str = ('[%%-%ds]' % width) % (int(width * percent) * '#')print('\r%s %d%%' % (show_str, int(100 * percent)), file=sys.stdout, flush=True, end='')time.sleep(0.1)# 模拟数据传输进度
data_size = 1025
recv_size = 0
while recv_size < data_size:time.sleep(0.1) # 模拟延迟recv_size += 1024percent = recv_size / data_sizeprogress(percent, width=70)
六、json 和 pickle 模块:数据序列化
序列化是将内存中的对象转换为可存储或传输的格式的过程,反序列化则是其逆过程。
1. json 模块:跨平台数据交互
json 格式是一种轻量级的数据交换格式,被多种语言支持,适合跨平台数据传输。
import json# 序列化:将 Python 对象转换为 json 字符串
data = {'name': 'Alice', 'age': 20, 'is_student': True}
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print(json_str)# 反序列化:将 json 字符串转换为 Python 对象
data = json.loads(json_str)
print(data['name']) # 输出:Alice
json 支持的数据类型与 Python 类型的对应关系如下:
Json 类型 | Python 类型 |
---|---|
{} | dict |
[] | list |
"string" | str |
520.13 | int 或 float |
true/false | True/False |
null | None |
2. pickle 模块:Python 专属序列化
pickle 模块可序列化 Python 中所有数据类型(包括对象),但仅支持 Python 语言,不同版本的 Python 可能不兼容。
import pickle# 序列化:将 Python 对象写入文件
data = {'name': 'Bob', 'scores': [90, 85, 95]}
with open('data.pkl', 'wb') as f:pickle.dump(data, f)# 反序列化:从文件读取 Python 对象
with open('data.pkl', 'rb') as f:data = pickle.load(f)
print(data['scores']) # 输出:[90, 85, 95]
七、hashlib 模块:哈希算法
hashlib 模块提供了多种哈希算法(如 MD5、SHA 系列),可将任意数据转换为固定长度的哈希值,常用于密码加密、数据校验等。
1. 基本使用(以 MD5 为例)
import hashlib# 创建 MD5 哈希对象
md5 = hashlib.md5()
# 更新哈希对象(传入 bytes 类型数据)
md5.update('hello world'.encode('utf-8'))
# 获取哈希值(十六进制字符串)
print(md5.hexdigest()) # 输出:5eb63bbbe01eeed093cb22bb8f5acdc3
2. 哈希值的特点
- 输入相同,输出必相同。
- 不可逆:无法从哈希值反推原始数据。
- 固定长度:无论输入数据大小,哈希值长度固定。
八、shutil 模块:高级文件操作
shutil 模块提供了文件复制、移动、删除、压缩和解压等高级操作,功能比 os 模块更丰富。
1. 复制文件
import shutil# 复制文件内容(需打开文件对象)
with open('f1.txt', 'rb') as f1, open('f2.txt', 'wb') as f2:shutil.copyfileobj(f1, f2)# 直接通过文件名复制
shutil.copyfile('f1.txt', 'f3.txt')# 复制文件内容及权限
shutil.copy('f1.txt', 'f4.txt')# 复制文件内容及所有状态信息(权限、时间等)
shutil.copy2('f1.txt', 'f5.txt')
2. 移动文件
shutil.move('f1.txt', 'dir1/') # 将文件移动到目录 dir1
shutil.move('f2.txt', 'f6.txt') # 重命名文件
3. 压缩与解压
# 创建压缩文件(格式支持 zip、tar 等)
shutil.make_archive('archive', 'zip', root_dir='dir1') # 将 dir1 目录压缩为 archive.zip# 解压文件
shutil.unpack_archive('archive.zip', extract_dir='dir2') # 将 archive.zip 解压到 dir2
九、subprocess 模块:执行系统命令
subprocess 模块用于在 Python 中执行系统命令,并获取命令的输出结果。
import subprocess# 执行命令,获取输出
result = subprocess.Popen('ls -l', # 要执行的命令(Linux 系统)shell=True,stdout=subprocess.PIPE, # 命令成功时的输出管道stderr=subprocess.PIPE # 命令失败时的错误管道
)# 读取输出(需解码)
stdout = result.stdout.read().decode('utf-8')
stderr = result.stderr.read().decode('utf-8')print('标准输出:', stdout)
print('错误输出:', stderr)
十、logging 模块:日志记录
logging 模块用于记录程序运行过程中的日志信息,便于调试和监控。
1. 日志级别
日志级别从低到高依次为:
DEBUG
(10):调试信息INFO
(20):普通信息WARNING
(30):警告信息(默认级别)ERROR
(40):错误信息CRITICAL
(50):严重错误信息
2. 基本使用
import logging# 配置日志(输出到文件,指定格式和级别)
logging.basicConfig(filename='app.log',format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',datefmt='%Y-%m-%d %H:%M:%S',level=logging.DEBUG # 记录 DEBUG 及以上级别的日志
)# 记录日志
logging.debug('调试信息')
logging.info('程序启动')
logging.warning('注意:内存不足')
logging.error('文件读取失败')
logging.critical('系统崩溃')
3. 高级配置
通过配置字典可实现更灵活的日志管理(如同时输出到文件和终端,设置不同格式):
import logging.configLOGGING_DIC = {'version': 1,'disable_existing_loggers': False,'formatters': {'standard': {'format': '[%(asctime)s][%(levelname)s] %(message)s'},},'handlers': {'console': {'level': 'DEBUG','class': 'logging.StreamHandler','formatter': 'standard'},'file': {'level': 'INFO','class': 'logging.FileHandler','filename': 'app.log','formatter': 'standard'}},'loggers': {'': {'handlers': ['console', 'file'],'level': 'DEBUG','propagate': False}}
}logging.config.dictConfig(LOGGING_DIC)
logger = logging.getLogger(__name__)
logger.debug('调试信息') # 输出到终端
logger.info('程序启动') # 输出到终端和文件
十一、re 模块:正则表达式
正则表达式是一种用于匹配字符串的模式,re 模块提供了正则表达式的支持。
1. 常用匹配模式
模式 | 描述 |
---|---|
\w | 匹配字母、数字及下划线 |
\W | 匹配非字母、数字及下划线 |
\s | 匹配任意空白字符(空格、换行、制表符等) |
\S | 匹配任意非空白字符 |
\d | 匹配任意数字(0-9) |
\D | 匹配任意非数字 |
. | 匹配任意字符(除换行符,指定 re.DOTALL 可包含换行符) |
* | 匹配前面的表达式 0 次或多次(贪婪模式) |
+ | 匹配前面的表达式 1 次或多次(贪婪模式) |
? | 匹配前面的表达式 0 次或 1 次;或用于非贪婪模式(如 .*?) |
{n,m} | 匹配前面的表达式 n 到 m 次 |
[] | 匹配括号内的任意字符(如 [a-z] 匹配小写字母) |
[^] | 匹配不在括号内的任意字符(如 [^0-9] 匹配非数字) |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
() | 分组匹配 |
2. 常用方法
import re# findall:返回所有匹配结果的列表
print(re.findall(r'\d+', 'abc123def456')) # 输出:['123', '456']# search:找到第一个匹配,返回匹配对象(通过 group() 获取结果)
match = re.search(r'\d+', 'abc123def456')
print(match.group()) # 输出:123# sub:替换匹配的字符串
print(re.sub(r'\d+', 'num', 'abc123def456')) # 输出:'abcnumdefnum'# compile:编译正则表达式,提高复用效率
pattern = re.compile(r'\d+')
print(pattern.findall('abc123def456')) # 输出:['123', '456']