pin_drop当前位置:知识文库 ❯ 图文

Python标准库os详解

一、os模块概述

os模块是Python标准库中最常用的模块之一,提供了与操作系统交互的接口。通过os模块,我们可以执行目录操作、文件操作、环境变量管理、进程管理等系统级任务。

代码示例

import os

# 查看当前操作系统类型
print(os.name)
# Windows输出: 'nt'
# Linux/Mac输出: 'posix'

# 查看操作系统详细信息
print(os.uname())  # 仅在Unix/Linux可用

# 获取当前工作目录
print(os.getcwd())
# 输出示例: C:\Users\user\project

# 查看os模块包含的所有功能
print(dir(os))

二、路径操作

os模块通过os.path子模块提供路径操作功能。注意:Python 3.4+推荐使用pathlib模块,但os.path仍然广泛使用。

1. 路径拼接与拆分

代码示例

import os

# 路径拼接(自动处理不同操作系统的路径分隔符)
path = os.path.join('C:', 'Users', 'user', 'Documents', 'file.txt')
print(path)
# Windows输出: C:\Users\user\Documents\file.txt

# 拼接多个部分
path2 = os.path.join('base', 'subdir', 'file.txt')
print(path2)  # base\subdir\file.txt

# 获取文件名
print(os.path.basename('/path/to/file.txt'))  # file.txt

# 获取目录名
print(os.path.dirname('/path/to/file.txt'))  # /path/to

# 拆分路径为(目录, 文件名)元组
print(os.path.split('/path/to/file.txt'))
# 输出: ('/path/to', 'file.txt')

# 拆分文件名和扩展名
print(os.path.splitext('document.pdf'))
# 输出: ('document', '.pdf')

2. 路径属性检查

代码示例

import os

path = 'C:\\Users\\user\\Documents\\test.txt'

# 检查路径是否存在
print(os.path.exists(path))  # True 或 False

# 检查是否为文件
print(os.path.isfile(path))  # True 或 False

# 检查是否为目录
print(os.path.isdir('C:\\Users\\user\\Documents'))  # True 或 False

# 获取文件大小(字节)
print(os.path.getsize(path))  # 1024

# 获取最后修改时间(时间戳)
print(os.path.getmtime(path))  # 1701234567.89

# 获取绝对路径
print(os.path.abspath('..\\file.txt'))
# 输出: C:\Users\user\file.txt

# 规范化路径(去除多余的斜杠等)
print(os.path.normpath('C:\\Users\\..\\Users\\user\\file.txt'))
# 输出: C:\Users\user\file.txt

3. 路径对比

代码示例

import os

path1 = 'C:\\Users\\user\\file.txt'
path2 = 'C:\\Users\\USER\\File.TXT'

# 检查两个路径是否指向同一个文件(Windows不区分大小写)
print(os.path.samefile(path1, path2))

# 获取路径的真实路径(解析符号链接等)
print(os.path.realpath('./file.txt'))
方法 功能 返回值
os.path.join() 拼接路径 字符串路径
os.path.exists() 检查路径是否存在 True/False
os.path.isfile() 检查是否为文件 True/False
os.path.isdir() 检查是否为目录 True/False
os.path.getsize() 获取文件大小 字节数(int)
os.path.splitext() 拆分文件名和扩展名 元组(name, ext)

三、目录操作

1. 创建与删除目录

代码示例

import os

# 创建单个目录
os.mkdir('new_folder')

# 创建多级目录(推荐)
os.makedirs('project/src/utils', exist_ok=True)
# exist_ok=True 表示目录已存在时不报错

# 删除空目录
os.rmdir('empty_folder')

# 删除多级空目录
os.removedirs('a/b/c')  # c必须为空目录

# 删除目录及其所有内容(慎用!)
import shutil
shutil.rmtree('folder_to_delete')

2. 遍历目录

代码示例

import os

# 使用os.walk()遍历目录树
for root, dirs, files in os.walk('C:\\Users\\user\\project'):
    print(f"当前目录: {root}")
    print(f"子目录: {dirs}")
    print(f"文件: {files}")
    print("-" * 50)

# 实际示例:查找所有.py文件
py_files = []
for root, dirs, files in os.walk('C:\\Users\\user\\project'):
    for file in files:
        if file.endswith('.py'):
            full_path = os.path.join(root, file)
            py_files.append(full_path)

print(f"找到 {len(py_files)} 个Python文件")
for f in py_files:
    print(f)

# 列出目录内容(不递归)
items = os.listdir('C:\\Users\\user\\project')
print(items)  # ['file1.txt', 'folder1', 'script.py']

3. 切换与获取工作目录

代码示例

import os

# 获取当前工作目录
cwd = os.getcwd()
print(f"当前目录: {cwd}")

# 切换工作目录
os.chdir('C:\\Users\\user\\project')
print(f"新目录: {os.getcwd()}")

# 返回上级目录
os.chdir('..')

# 切换到用户主目录
os.chdir(os.path.expanduser('~'))
print(f"主目录: {os.getcwd()}")

四、文件操作

1. 文件基本操作

代码示例

import os

# 重命名文件
os.rename('old_name.txt', 'new_name.txt')

# 删除文件
os.remove('file_to_delete.txt')

# 复制文件(需要使用shutil)
import shutil
shutil.copy('source.txt', 'destination.txt')
shutil.copy2('source.txt', 'destination.txt')  # 保留元数据

# 移动文件
shutil.move('source.txt', 'new_location/source.txt')

2. 文件属性操作

代码示例

import os
import time

path = 'example.txt'

# 获取文件状态信息
stat_info = os.stat(path)
print(f"文件大小: {stat_info.st_size} 字节")
print(f"最后访问: {time.ctime(stat_info.st_atime)}")
print(f"最后修改: {time.ctime(stat_info.st_mtime)}")
print(f"创建时间: {time.ctime(stat_info.st_ctime)}")

# 修改文件权限(Unix/Linux)
# os.chmod('script.sh', 0o755)

# Windows下设置文件只读属性
import stat
os.chmod('file.txt', stat.S_IREAD)  # 只读
os.chmod('file.txt', stat.S_IREAD | stat.S_IWRITE)  # 读写

3. 批量文件处理示例

代码示例

import os

def batch_rename_files(directory, old_ext, new_ext):
    """批量修改文件扩展名"""
    for filename in os.listdir(directory):
        if filename.endswith(old_ext):
            old_path = os.path.join(directory, filename)
            new_name = filename[:-len(old_ext)] + new_ext
            new_path = os.path.join(directory, new_name)
            os.rename(old_path, new_path)
            print(f"重命名: {filename} -> {new_name}")

def find_large_files(directory, size_mb=100):
    """查找大于指定大小的文件"""
    size_bytes = size_mb * 1024 * 1024
    large_files = []
    
    for root, dirs, files in os.walk(directory):
        for file in files:
            full_path = os.path.join(root, file)
            if os.path.getsize(full_path) > size_bytes:
                size_mb = os.path.getsize(full_path) / (1024 * 1024)
                large_files.append((full_path, size_mb))
    
    return sorted(large_files, key=lambda x: x[1], reverse=True)

# 使用示例
# batch_rename_files('C:\\photos', '.jpg', '.jpeg')
# large_files = find_large_files('C:\\Users')
# for path, size in large_files[:10]:
#     print(f"{path}: {size:.2f} MB")

五、环境变量管理

1. 读取环境变量

代码示例

import os

# 获取单个环境变量
path_env = os.environ.get('PATH')
print(f"PATH: {path_env}")

# 获取用户主目录
home = os.environ.get('USERPROFILE')  # Windows
# home = os.environ.get('HOME')  # Linux/Mac
print(f"主目录: {home}")

# 安全获取(提供默认值)
api_key = os.environ.get('API_KEY', 'default-key')
print(f"API密钥: {api_key}")

# 查看所有环境变量
for key, value in os.environ.items():
    print(f"{key} = {value[:50]}...")

2. 设置环境变量

代码示例

import os

# 设置环境变量(仅在当前进程有效)
os.environ['API_KEY'] = 'your-secret-key'
os.environ['DEBUG'] = 'True'

# 验证设置成功
print(os.environ.get('API_KEY'))

# 删除环境变量
del os.environ['API_KEY']

# 注意:通过os.environ设置的环境变量
# 只影响当前Python进程及其子进程
# 不会影响系统级别的环境变量

3. 实际应用:配置文件加载

代码示例

import os

class Config:
    """从环境变量加载配置"""
    
    DEBUG = os.environ.get('DEBUG', 'False').lower() == 'true'
    DATABASE_URL = os.environ.get('DATABASE_URL', 'sqlite:///default.db')
    SECRET_KEY = os.environ.get('SECRET_KEY', 'fallback-secret')
    MAX_WORKERS = int(os.environ.get('MAX_WORKERS', '4'))
    
    @classmethod
    def print_config(cls):
        """打印当前配置(不打印敏感信息)"""
        for attr in dir(cls):
            if not attr.startswith('_') and attr.isupper():
                value = getattr(cls, attr)
                if 'KEY' in attr or 'PASSWORD' in attr:
                    value = '***hidden***'
                print(f"{attr}: {value}")

# 使用
Config.print_config()

六、进程与系统信息

1. 执行系统命令

代码示例

import os

# 执行系统命令并返回退出状态
exit_code = os.system('dir')  # Windows
# exit_code = os.system('ls')  # Linux/Mac

# 更推荐使用subprocess模块
import subprocess

# 执行命令并获取输出
result = subprocess.run(['dir'], capture_output=True, text=True, shell=True)
print(result.stdout)

# 执行Python脚本
os.system('python script.py --arg1 value1')

2. 进程ID管理

代码示例

import os

# 获取当前进程ID
pid = os.getpid()
print(f"当前进程ID: {pid}")

# 获取父进程ID(仅Unix)
# ppid = os.getppid()
# print(f"父进程ID: {ppid}")

# 终止进程(危险操作)
# os.kill(pid, signal.SIGTERM)

3. 系统信息获取

代码示例

import os

# 操作系统名称
print(f"系统: {os.name}")

# 当前工作目录
print(f"工作目录: {os.getcwd()}")

# 用户主目录
print(f"主目录: {os.path.expanduser('~')}")

# CPU数量
print(f"CPU数量: {os.cpu_count()}")

# 系统环境变量中的路径分隔符
print(f"路径分隔符: {os.pathsep}")  # Windows: ;  Linux: :

# 文件路径分隔符
print(f"路径分隔符: {os.sep}")  # Windows: \  Linux: /

# 换行符
print(f"换行符: {os.linesep}")  # Windows: \r\n  Linux: \n

小贴士

对于新的Python项目(Python 3.4+),建议优先使用pathlib模块进行路径操作。pathlib提供面向对象的API,代码更加直观和易读。但了解os模块仍然很重要,因为大量现有代码仍在使用它。


七、注意事项与最佳实践

注意1:使用os.path.join()而非字符串拼接来构建路径,这样可以保证跨平台兼容性。不要手动使用"\""/"拼接路径。

注意2:操作文件前先检查文件是否存在,使用os.path.exists()或使用try...except捕获FileNotFoundError。删除文件时务必谨慎,建议先备份。

注意3:不要在代码中硬编码绝对路径,使用相对路径或从环境变量/配置文件中读取路径。这样可以提高代码的可移植性和安全性。

最佳实践总结:

  • 跨平台兼容:始终使用os.path.join()处理路径

  • 安全检查:操作前检查路径是否存在,或使用异常处理

  • 环境变量:敏感信息(API密钥等)通过环境变量传递,不要硬编码

  • 现代替代:Python 3.4+项目优先使用pathlib

  • 谨慎删除:使用shutil.rmtree()前务必确认目录路径正确


八、小结

  • 路径操作:使用os.path进行路径拼接、拆分、检查和转换

  • 目录操作:使用os.mkdir()os.makedirs()创建目录,os.walk()遍历目录树

  • 文件操作:使用os.rename()os.remove()管理文件

  • 环境变量:通过os.environ读取和设置环境变量

  • 系统信息:获取进程ID、CPU数量、系统类型等操作系统信息


九、练习题

练习1

编写一个函数scan_directory(path, extension),接收目录路径和文件扩展名作为参数,递归查找该目录下所有指定扩展名的文件,返回包含文件完整路径和文件大小的列表,并按文件大小从大到小排序。

练习2

创建一个项目初始化脚本,接收项目名称作为参数,自动创建以下目录结构,并在每个目录中创建空的__init__.py文件。同时从环境变量读取作者信息写入到README.md文件中。

project_name/src/__init__.py
project_name/tests/__init__.py
project_name/docs/
project_name/README.md

常见问题

os.path和pathlib应该选择哪个?

Python 3.4+推荐使用pathlib,它提供面向对象的API,代码更加直观。但os.path在现有代码中广泛使用,了解两者都很重要。新项目优先使用pathlib,维护旧代码时需要理解os.path。

如何安全地删除目录?

安全删除目录的步骤:1)先验证路径是否正确;2)检查目录是否包含重要文件;3)可以先移动到临时位置而不是直接删除;4)使用shutil.rmtree()时捕获异常;5)在删除前打印确认信息。

os.system()和subprocess有什么区别?

os.system()简单但功能有限,只返回退出状态;subprocess模块功能更强大,可以捕获输出、处理输入、管理进程等。推荐在新代码中使用subprocess.run()

如何处理路径中的中文字符?

Python 3默认使用Unicode处理字符串,中文路径通常没有问题。确保:1)使用原始字符串或双反斜杠(r"C:\中文路径");2)文件编码使用UTF-8;3)在Windows上使用os.path而非手动拼接。

标签: os模块 路径操作 文件管理 环境变量 标准库 目录遍历

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python pip包管理 下一篇: Python标准库sys详解

poll相关推荐