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'))
三、目录操作
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而非手动拼接。
本文涉及AI创作
内容由AI创作,请仔细甄别