Python标准库实战指南:掌握核心模块的妙用
# 综合应用示例:日志分析工具
import os
import re
import sys
from datetime import datetime
def analyze_logs(directory):
"""分析指定目录下的日志文件"""
log_pattern = re.compile(
r'(?P<ip>\d+\.\d+\.\d+\.\d+) - - '
r'\[(?P<time>.*?)\] '
r'"(?P<method>\w+) (?P<url>.*?) HTTP/\d\.\d" '
r'(?P<status>\d{3}) \d+ '
r'"(?P<referrer>.*?)" "(?P<agent>.*?)"'
)
for root, _, files in os.walk(directory):
for filename in files:
if filename.endswith('.log'):
filepath = os.path.join(root, filename)
with open(filepath, 'r', errors='ignore') as f:
for line in f:
match = log_pattern.search(line)
if match:
log_data = match.groupdict()
log_time = datetime.strptime(
log_data['time'],
'%d/%b/%Y:%H:%M:%S %z'
)
# 进行时间过滤分析
if log_time.hour >= 20:
print(f"夜间访问: {log_data['ip']}")
if __name__ == '__main__':
if len(sys.argv) != 2:
print("Usage: python log_analyzer.py <directory>")
sys.exit(1)
analyze_logs(sys.argv[1])
一、操作系统交互双雄
- os模块核心功能
import os
# 路径操作
current_dir = os.getcwd()
new_path = os.path.join('docs', '2023', 'report.pdf') # 跨平台安全拼接
# 文件系统操作
os.makedirs('temp/archive', exist_ok=True) # 递归创建目录
os.rename('old.txt', 'new.txt')
# 环境变量管理
db_host = os.environ.get('DB_HOST', 'localhost')
# 执行系统命令
os.system('echo $PATH') # 简单命令
output = os.popen('ls -l').read() # 获取命令输出
- sys模块实用技巧
import sys
# 命令行参数处理
if len(sys.argv) > 1:
input_file = sys.argv[1]
# 退出程序控制
if not os.path.exists(input_file):
print("文件不存在!", file=sys.stderr)
sys.exit(1)
# 模块搜索路径管理
sys.path.append('/opt/custom_modules')
# 编码配置
print(f"默认编码: {sys.getdefaultencoding()}")
print(f"文件系统编码: {sys.getfilesystemencoding()}")
二、时间处理大师
- datetime核心操作
from datetime import datetime, timedelta
# 时间创建与格式化
now = datetime.now()
formatted = now.strftime('%Y-%m-%d %H:%M:%S') # 2023-08-20 14:35:00
# 时区处理(Python 3.9+)
from zoneinfo import ZoneInfo
utc_time = datetime.now(ZoneInfo('UTC'))
bj_time = utc_time.astimezone(ZoneInfo('Asia/Shanghai'))
# 时间计算
tomorrow = now + timedelta(days=1)
last_week = now - timedelta(weeks=1)
# 持续时间测量
start = datetime.now()
# 执行某些操作...
duration = datetime.now() - start
print(f"耗时: {duration.total_seconds():.2f}秒")
- 时间处理对比表
需求 | 推荐方法 | 替代方案 |
---|---|---|
获取当前时间 | datetime.now() |
time.time() |
格式转换 | strftime/strptime |
time.strftime |
时区转换 | zoneinfo 模块 |
pytz 第三方库 |
高精度计时 | time.perf_counter() |
datetime.timedelta |
跨时区业务逻辑 | 始终使用UTC时间存储 | 本地时间转换 |
三、正则表达式实战
- 常用模式速查表
import re
# 验证类模式
email_re = re.compile(r'^[\w\.-]+@[\w\.-]+\.\w+$') # 邮箱验证
phone_re = re.compile(r'^1[3-9]\d{9}$') # 手机号验证
url_re = re.compile(
r'^(https?://)?' # 协议
r'([\w-]+\.)+[\w-]+' # 域名
r'(:\d+)?' # 端口
r'(/[\w\-./?%&=]*)?$' # 路径
)
# 提取类模式
ip_re = re.compile(r'\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b')
price_re = re.compile(r'¥(\d+(?:\.\d{2})?)') # 匹配价格
# 替换操作示例
text = "联系我:138-1234-5678 或 010-12345678"
clean_phone = re.sub(r'\D', '', text) # 1381234567801012345678
- 性能优化技巧
# 预编译正则表达式
DATE_PATTERN = re.compile(r'\d{4}-\d{2}-\d{2}')
# 使用非捕获组
re.compile(r'(?:https?|ftp)://([^/]+)')
# 避免回溯灾难
# 错误示范:r'(a+)+b' 匹配 'aaaaaaaaac'
# 正确做法:r'a+b'
# 使用原子分组(Python 3.11+)
# re.compile(r'(?>a+)b')
# 基准测试对比
import timeit
setup = '''
import re
text = 'a' * 100 + 'b'
pattern1 = re.compile(r'(a+)+b')
pattern2 = re.compile(r'a+b')
'''
print(timeit.timeit('pattern1.match(text)', setup, number=1000)) # ~0.15s
print(timeit.timeit('pattern2.match(text)', setup, number=1000)) # ~0.0001s
综合应用案例:文件批量重命名工具
import os
import re
from datetime import datetime
def batch_rename(directory, pattern, replacement):
"""
批量重命名文件工具
:param directory: 目标目录
:param pattern: 匹配正则表达式
:param replacement: 替换模板
"""
regex = re.compile(pattern)
for filename in os.listdir(directory):
if regex.search(filename):
new_name = regex.sub(replacement, filename)
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
new_name = f"{timestamp}_{new_name}"
src = os.path.join(directory, filename)
dst = os.path.join(directory, new_name)
os.rename(src, dst)
print(f"重命名: {filename} -> {new_name}")
# 使用示例:将IMG_1234.jpg重命名为20230820_1234.jpg
batch_rename(
'/photos',
r'IMG_(\d{4})\.jpg',
r'\1',
)
最佳实践清单:
- 使用
os.path
处理路径,不要手动拼接 - 优先使用
pathlib
(Python 3.4+)进行现代路径操作 - 敏感操作前检查文件/目录是否存在
- 处理时间始终考虑时区问题
- 复杂正则表达式添加详细注释
- 重用预编译的正则表达式对象
- 使用
sys.exit(code)
明确退出状态 - 处理外部命令输出时注意编码问题
- 使用
datetime
替代已弃用的time
模块函数 - 正则表达式测试工具推荐:regex101.com
# 生产环境配置示例
import sys
import logging
def safe_os_operation(func, *args):
"""带错误处理的OS操作包装器"""
try:
return func(*args)
except OSError as e:
logging.error(f"操作失败: {str(e)}")
sys.exit(1)
# 安全创建目录
safe_os_operation(os.makedirs, 'important_data', exist_ok=True)
模块选择指南:
需求场景 | 推荐模块 | 替代方案 |
---|---|---|
文件路径操作 | pathlib |
os.path |
系统命令执行 | subprocess |
os.system |
时间戳处理 | datetime |
time |
复杂字符串解析 | re |
字符串方法 |
跨平台路径处理 | os.path + os.sep |
手动拼接 |
高性能正则匹配 | 预编译正则对象 | 即时编译 |
时区敏感操作 | zoneinfo |
pytz 第三方库 |