AI大模型教程
一起来学习

(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 sys

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

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

import sys

def 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 sys

def validate_number(num):
    if not isinstance(num, int):
        print("错误:参数必须是整数")
        sys.exit(1)  # 异常退出,状态码 1
    print(f"验证通过:{num}")

validate_number("abc")  
3. 解释器信息获取
  • sys.version:获取 Python 解释器的版本信息

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

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

代码示例:

import sys

print(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 os

def 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 os

file_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 os

def 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 time

def 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 = cat
                    break
            
            # 创建类别目录
            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() 

四、总结

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

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

文章来源于互联网:(Python模块)Python 的进阶工具:sys模块、os模块 与 logging 模块

赞(0)
未经允许不得转载:5bei.cn大模型教程网 » (Python模块)Python 的进阶工具:sys模块、os模块 与 logging 模块
分享到: 更多 (0)

AI大模型,我们的未来

小欢软考联系我们