python基础入门:7.4常用标准库实战

发布于:2025-02-12 ⋅ 阅读:(63) ⋅ 点赞:(0)

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])
一、操作系统交互双雄
  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()  # 获取命令输出
  1. 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()}")
二、时间处理大师
  1. 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}秒")
  1. 时间处理对比表
需求 推荐方法 替代方案
获取当前时间 datetime.now() time.time()
格式转换 strftime/strptime time.strftime
时区转换 zoneinfo模块 pytz第三方库
高精度计时 time.perf_counter() datetime.timedelta
跨时区业务逻辑 始终使用UTC时间存储 本地时间转换
三、正则表达式实战
  1. 常用模式速查表
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
  1. 性能优化技巧
# 预编译正则表达式
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',
)

最佳实践清单

  1. 使用os.path处理路径,不要手动拼接
  2. 优先使用pathlib(Python 3.4+)进行现代路径操作
  3. 敏感操作前检查文件/目录是否存在
  4. 处理时间始终考虑时区问题
  5. 复杂正则表达式添加详细注释
  6. 重用预编译的正则表达式对象
  7. 使用sys.exit(code)明确退出状态
  8. 处理外部命令输出时注意编码问题
  9. 使用datetime替代已弃用的time模块函数
  10. 正则表达式测试工具推荐: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第三方库
处理需求
涉及文件/路径?
使用os/pathlib
涉及系统环境?
使用sys
涉及时间日期?
使用datetime
需要模式匹配?
使用re
使用其他模块

网站公告

今日签到

点亮在社区的每一天
去签到