当前位置: 首页 > news >正文

(Python模块)Python 的进阶工具:sys模块、os模块 与 logging 模块

目录

一、引言

二、核心概念与语法

(一)sys 模块:解释器交互核心

1. 命令行参数处理:sys.argv

2. 程序退出控制:sys.exit ()

3. 解释器信息获取

(二)os 模块:操作系统接口

1. 文件与目录操作

2. 路径处理:os.path 子模块

3. 环境变量操作

(三)logging 模块:专业日志系统

1. 日志级别

2. 基础配置

3. 高级配置:多处理器与格式化

三、应用场景

(一)sys 模块:命令行工具开发

(二)os 模块:文件系统自动化

(三)logging 模块:应用监控与调试

四、总结


一、引言

        在 Python 编程的进阶之旅中,sys、os 和 logging 模块是不可或缺的三大工具。sys 模块提供了与 Python 解释器交互的接口,让程序能够感知和控制自身运行环境;os 模块赋予程序操作文件系统的能力,实现跨平台的文件和目录管理;logging 模块则为程序提供了专业的日志记录系统,帮助开发者监控运行状态、追踪问题。掌握这三个模块,能够显著提升代码的健壮性、可维护性和功能性。接下来,让我们深入探索它们的核心功能与应用场景。

二、核心概念与语法

(一)sys 模块:解释器交互核心

        sys 模块提供了一系列与 Python 解释器紧密相关的变量和函数,是程序与运行环境沟通的桥梁。

1. 命令行参数处理:sys.argv

  sys.argv 是一个包含命令行参数的列表,第一个元素是脚本名称,后续元素是传递给脚本的参数

语法格式:

import sys

# sys.argv[0] 为脚本名

# sys.argv[1:] 为传递的参数

示例 1:简单参数解析

import sysif __name__ == "__main__":print(f"脚本名称:{sys.argv[0]}")if len(sys.argv) > 1:print(f"传递的参数:{sys.argv[1:]}")else:print("未传递任何参数")

示例 2:带选项的参数处理

import sysdef main():if "--help" in sys.argv:print("使用方法:python script.py [--option] [参数]")sys.exit(0)print("程序继续执行...")if __name__ == "__main__":main()
2. 程序退出控制:sys.exit ()

  sys.exit() 用于终止当前程序的执行,可接受一个整数参数作为退出状态码(0 表示正常退出,非零表示异常)。

代码示例:

import sysdef validate_number(num):if not isinstance(num, int):print("错误:参数必须是整数")sys.exit(1)  # 异常退出,状态码 1print(f"验证通过:{num}")validate_number("abc")  
3. 解释器信息获取

  • sys.version:获取 Python 解释器的版本信息

  • sys.platform:获取当前操作系统平台标识

  • sys.path:获取模块搜索路径

代码示例:

import sysprint(f"Python 版本:{sys.version.split()[0]}")
print(f"操作系统平台:{sys.platform}")
print(f"模块搜索路径:{sys.path[:3]}") 

(二)os 模块:操作系统接口

        os 模块提供了与操作系统交互的功能,涵盖文件操作、目录管理、环境变量等多个方面。

1. 文件与目录操作
  • os.listdir(path):返回指定目录下的所有文件和子目录

  • os.mkdir(path):创建目录(单级)

  • os.makedirs(path):递归创建多级目录

  • os.remove(path):删除文件

  • os.rmdir(path):删除空目录

  • os.rename(src, dst):重命名文件或目录

代码示例:文件批量重命名

import osdef batch_rename(directory, old_str, new_str):"""批量替换目录中所有文件和子目录名中的指定字符串"""for item in os.listdir(directory):old_path = os.path.join(directory, item)new_item = item.replace(old_str, new_str)new_path = os.path.join(directory, new_item)if os.path.isdir(old_path):os.rename(old_path, new_path)batch_rename(new_path, old_str, new_str)  # 递归处理子目录else:os.rename(old_path, new_path)# 使用示例
batch_rename("photos", "old_", "new_")
2. 路径处理:os.path 子模块
  • os.path.join(path1, path2, ...):拼接路径

  • os.path.exists(path):检查路径是否存在

  • os.path.isfile(path)/os.path.isdir(path):判断是否为文件 / 目录

  • os.path.split(path):分割路径为目录和文件名

  • os.path.basename(path)/os.path.dirname(path):获取文件名 / 目录名

代码示例:路径操作综合应用

import osfile_path = "/home/user/docs/report.txt"print(f"路径是否存在:{os.path.exists(file_path)}")
print(f"是否为文件:{os.path.isfile(file_path)}")
print(f"目录名:{os.path.dirname(file_path)}")
print(f"文件名:{os.path.basename(file_path)}")
print(f"文件扩展名:{os.path.splitext(file_path)[1]}")# 拼接新路径
new_path = os.path.join(os.path.dirname(file_path), "new_report.txt")
print(f"新路径:{new_path}")
3. 环境变量操作
  • os.environ:获取环境变量字典

  • os.getenv(key, default):获取指定环境变量的值

代码示例:

import os# 获取系统环境变量
print(f"当前用户:{os.getenv('USER', 'unknown')}")  # Linux/macOS
print(f"PATH 环境变量:{os.getenv('PATH', '')[:50]}...")# 设置临时环境变量
os.environ["APP_CONFIG"] = "development"
print(f"应用配置:{os.environ['APP_CONFIG']}")

(三)logging 模块:专业日志系统

        logging 模块提供了灵活的日志记录功能,支持多级别日志、自定义格式和输出目标。

1. 日志级别

        从低到高依次为:DEBUGINFOWARNINGERRORCRITICAL

2. 基础配置

        使用 logging.basicConfig() 进行简单配置。

代码示例:

import logging# 配置日志输出到控制台
logging.basicConfig(level=logging.INFO,  # 设置日志级别format="%(asctime)s - %(levelname)s - %(message)s"  # 自定义格式
)# 使用不同级别的日志
logging.debug("这是一条调试信息")  # 不会输出,级别低于 INFO
logging.info("程序启动成功")
logging.warning("检测到潜在问题")
logging.error("操作失败:文件未找到")
logging.critical("系统崩溃,无法继续运行")
3. 高级配置:多处理器与格式化

        使用 LoggerHandler 和 Formatter 实现更复杂的日志系统。

代码示例:同时输出到文件和控制台

import logging
from logging.handlers import RotatingFileHandler# 创建自定义 logger
logger = logging.getLogger("my_app")
logger.setLevel(logging.DEBUG)  # 设置最低级别# 创建文件处理器(按大小轮转,最大 1MB,保留 3 个备份)
file_handler = RotatingFileHandler("app.log", maxBytes=1024*1024, backupCount=3
)
file_handler.setLevel(logging.DEBUG)# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)# 设置格式化器
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)# 将处理器添加到 logger
logger.addHandler(file_handler)
logger.addHandler(console_handler)# 使用自定义 logger
logger.debug("这是一条调试信息(仅文件)")
logger.info("这是一条信息(文件和控制台)")
logger.error("这是一条错误信息")

三、应用场景

(一)sys 模块:命令行工具开发

        开发需要接收命令行参数的工具时,sys 模块是首选。

代码示例:文件内容搜索工具

import sys
import osdef search_file(file_path, keyword):"""在文件中搜索关键词"""try:with open(file_path, "r", encoding="utf-8") as f:for line_num, line in enumerate(f, 1):if keyword in line:print(f"{file_path}:{line_num}: {line.strip()}")except Exception as e:print(f"无法读取 {file_path}: {e}")def main():if len(sys.argv) != 3:print(f"用法:{sys.argv[0]} <目录> <关键词>")sys.exit(1)directory = sys.argv[1]keyword = sys.argv[2]if not os.path.isdir(directory):print(f"错误:目录 '{directory}' 不存在")sys.exit(1)for root, _, files in os.walk(directory):for file in files:search_file(os.path.join(root, file), keyword)if __name__ == "__main__":main()

(二)os 模块:文件系统自动化

        处理文件和目录的批量操作时,os 模块是最佳选择。

代码示例:文件分类整理工具

import os
import shutil
import timedef organize_files(source_dir):"""按文件类型和创建时间整理目录"""if not os.path.exists(source_dir):print(f"错误:目录 '{source_dir}' 不存在")return# 创建分类目录categories = {"documents": [".pdf", ".docx", ".txt", ".xlsx"],"images": [".jpg", ".png", ".jpeg", ".gif"],"videos": [".mp4", ".mov", ".avi"],"archives": [".zip", ".rar", ".tar", ".gz"],"programs": [".exe", ".app", ".msi"]}# 按文件类型分类for item in os.listdir(source_dir):item_path = os.path.join(source_dir, item)if os.path.isfile(item_path):# 获取文件扩展名ext = os.path.splitext(item)[1].lower()# 确定目标类别category = "others"for cat, exts in categories.items():if ext in exts:category = catbreak# 创建类别目录cat_dir = os.path.join(source_dir, category)os.makedirs(cat_dir, exist_ok=True)# 移动文件shutil.move(item_path, os.path.join(cat_dir, item))print(f"已移动 {item} 到 {category}")# 按创建时间进一步整理图片目录images_dir = os.path.join(source_dir, "images")if os.path.exists(images_dir):for item in os.listdir(images_dir):item_path = os.path.join(images_dir, item)if os.path.isfile(item_path):# 获取文件创建时间ctime = os.path.getctime(item_path)year_month = time.strftime("%Y-%m", time.localtime(ctime))# 创建年月目录time_dir = os.path.join(images_dir, year_month)os.makedirs(time_dir, exist_ok=True)# 移动文件shutil.move(item_path, os.path.join(time_dir, item))print(f"已按时间整理 {item}")if __name__ == "__main__":organize_files("downloads")  # 整理下载目录

代码示例:封装函数 使用递归找到指定路径的所有文件

import os
def get_path(path):if os.path.isfile(path):print(f"{path}是文件")else:sub_paths = os.listdir(path)for sub_path in sub_paths:abs_path = os.path.join(path,sub_path)get_path(abs_path)get_path("C:\\Users\\Administrator\\python0625")

(三)logging 模块:应用监控与调试

        在大型应用中,使用 logging 模块记录关键信息和错误。

代码示例:Web 应用请求日志

import logging
from logging.handlers import TimedRotatingFileHandler
import time
import random# 配置日志
logger = logging.getLogger("web_app")
logger.setLevel(logging.INFO)# 按天轮转的文件处理器
file_handler = TimedRotatingFileHandler("web_app.log", when="D", interval=1, backupCount=7
)
file_handler.setLevel(logging.INFO)# 控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)# 自定义日志格式
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(client_ip)s - %(path)s - %(status_code)s"
)
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)# 添加处理器
logger.addHandler(file_handler)
logger.addHandler(console_handler)# 模拟 Web 应用请求处理
def handle_request(client_ip, path):# 记录请求开始start_time = time.time()logger.info("请求开始", extra={"client_ip": client_ip,"path": path,"status_code": "200"})# 模拟处理延迟time.sleep(random.uniform(0.1, 0.5))# 模拟随机错误if random.random() < 0.1:status_code = "500"logger.error("内部服务器错误", extra={"client_ip": client_ip,"path": path,"status_code": status_code})else:status_code = "200"logger.info("请求完成", extra={"client_ip": client_ip,"path": path,"status_code": status_code})# 记录响应时间duration = time.time() - start_timelogger.debug(f"响应时间:{duration:.3f}s", extra={"client_ip": client_ip,"path": path,"status_code": status_code})# 模拟多个请求
ips = ["192.168.1.1", "10.0.0.2", "172.16.0.3"]
paths = ["/", "/api/users", "/api/products", "/admin"]for _ in range(10):handle_request(random.choice(ips), random.choice(paths))time.sleep(0.2)

四、总结

        sys、os 和 logging 模块是 Python 编程中处理系统交互、文件操作和日志记录的核心工具。sys 模块让程序能够感知和控制自身运行环境,os 模块提供了跨平台的文件系统操作能力,logging 模块则构建了专业的日志系统。

        通过合理运用这些模块,开发者可以编写出更健壮、更灵活的 Python 程序。无论是开发命令行工具、自动化脚本,还是构建大型应用,这三个模块都是提升代码质量和开发效率的关键。建议开发者通过实际项目不断练习和掌握它们,以应对各种复杂的编程场景。

http://www.dtcms.com/a/291133.html

相关文章:

  • 通过TPLink路由器进行用户行为审计实战
  • tcpdump 命令解析(随手记)
  • Vue过度与动画效果
  • 【Linux】重生之从零开始学习运维之Mysql安装
  • GNU Radio多类信号多种参数数据集生成技巧
  • 【Spring AI】Advisors API—顾问(即拦截器)
  • 信号量demo
  • 【华为机试】503. 下一个更大元素 II
  • 【华为机试】85. 最大矩形
  • Excel函数 —— UNIQUE 去重提取唯一值
  • 智能码表新革命:VTX316-TTS语音芯片如何重塑骑行体验
  • 【补充】Linux内核链表机制
  • C语言自定义类型:联合体和枚举
  • CS231n-2017 Lecture4神经网络笔记
  • 【爬虫】05 - 爬虫攻防
  • 车载软件架构 --- 软件开发面临的问题
  • 神经网络——归一化层
  • 从 C# 到 Python:项目实战第五天的飞跃
  • Ubuntu 22 集群部署 Apache Doris 3.0.3 笔记
  • 音视频重回顾及nat内网穿透相关再整理笔记
  • Ubuntu 22.04 安装 Docker (安装包形式)
  • ESP32-S3 小电视学习笔记1:分光棱镜、QMI8658六轴惯导计、1.3英寸LCD屏
  • 4.Java创建对象有几种方式?
  • Spring Cloud——Spring Cloud LoadBalancer
  • 7月21日总结
  • C/C++---emplace和emplace_back
  • 企业IT管理——IT系统灾难恢复计划及实施步骤参考模板
  • rk3588 Android 12 添加framework层服务,HAL库,从硬件驱动层到上层APP,实现led灯控
  • OpenAI开发的一款实验性大型语言模型(LLM),在2025年国际数学奥林匹克竞赛(IMO)中达到了金牌水平
  • 数智管理学(三十七)