Python 第十五节 OS文件操作相关方法用途详解
前言
Python
中 OS
文件操作相关方法用途及功能。该模块可跨平台与操作系统交互,支持文件、目录操作等。可以进行工作目录的获取与切换、目录内容的列出、目录的创建与删除、文件的删除与重命名,以及环境变量获取和系统命令执行的相关操作
1. 导入 OS 模块
import os
2. 文件操作
2.1 文件重命名
# 重命名文件
os.rename('old_name.txt', 'new_name.txt')# 安全的重命名(如果目标存在则覆盖)
os.replace('old_name.txt', 'new_name.txt')
注意事项:
- 如果目标文件已存在,
rename()
可能失败 replace()
在目标存在时会覆盖,更安全- 跨文件系统重命名可能失败
2.2 删除文件
# 删除文件
os.remove('file.txt')# 如果文件不存在会抛出异常,建议先检查
if os.path.exists('file.txt'):os.remove('file.txt')
2.3 获取文件信息
import time# 获取文件状态file_stat = os.stat('file.txt')print(f"文件大小: {file_stat.st_size} bytes")print(f"最后修改时间: {time.ctime(file_stat.st_mtime)}")print(f"最后访问时间: {time.ctime(file_stat.st_atime)}")
3. 目录操作
3.1 创建目录
# 创建单个目录os.mkdir('new_directory')# 递归创建多级目录os.makedirs('path/to/nested/directory', exist_ok=True)# 创建目录并设置权限(Unix系统)os.mkdir('secure_dir', mode=0o755)
注意事项:
mkdir()
只能创建单级目录makedirs()
可以创建多级目录- 使用
exist_ok=True
避免目录已存在时的异常
3.2 删除目录
# 删除空目录os.rmdir('empty_directory')# 递归删除目录树(危险操作)import shutilshutil.rmtree('directory_to_remove')# 安全删除空目录if os.path.exists('dir') and os.path.isdir('dir'):try:os.rmdir('dir')except OSError as e:print(f"目录非空: {e}")
3.3 遍历目录
# 列出目录内容items = os.listdir('.')print("当前目录内容:", items)# 使用 scandir()(更高效)with os.scandir('.') as entries:for entry in entries:if entry.is_file():print(f"文件: {entry.name}")elif entry.is_dir():print(f"目录: {entry.name}")# 递归遍历目录树for root, dirs, files in os.walk('.'):print(f"当前目录: {root}")print(f"子目录: {dirs}")print(f"文件: {files}")print("-" * 40)
4. 路径操作
4.1 路径拼接和分解
# 安全的路径拼接full_path = os.path.join('folder', 'subfolder', 'file.txt')print(f"完整路径: {full_path}")# 路径分解directory, filename = os.path.split('/path/to/file.txt')print(f"目录: {directory}, 文件名: {filename}")name, extension = os.path.splitext('document.pdf')print(f"文件名: {name}, 扩展名: {extension}")
4.2 路径检查
path = '/path/to/some/file.txt'print(f"是否存在: {os.path.exists(path)}")print(f"是文件: {os.path.isfile(path)}")print(f"是目录: {os.path.isdir(path)}")print(f"是链接: {os.path.islink(path)}")print(f"绝对路径: {os.path.abspath(path)}")
5. 环境和工作目录
5.1 工作目录操作
# 获取当前工作目录current_dir = os.getcwd()print(f"当前目录: {current_dir}")# 改变工作目录os.chdir('/new/directory/path')# 临时改变工作目录(推荐)original_dir = os.getcwd()try:os.chdir('/temp/path')# 执行操作finally:os.chdir(original_dir) # 确保恢复原目录
5.2 环境变量
# 获取环境变量home_dir = os.getenv('HOME')path_var = os.getenv('PATH', '默认值') # 提供默认值# 设置环境变量(当前进程有效)os.environ['MY_VAR'] = 'my_value'# 获取所有环境变量for key, value in os.environ.items():print(f"{key}: {value}")
6. 高级文件操作
6.1 文件权限管理
import stat# 设置文件权限os.chmod('file.txt', stat.S_IRUSR | stat.S_IWUSR) # 用户读写# 检查文件权限file_mode = os.stat('file.txt').st_modeif file_mode & stat.S_IRUSR:print("用户有读权限")
6.2 创建临时文件
import tempfile# 创建临时文件(自动删除)
with tempfile.NamedTemporaryFile(mode='w+', delete=True) as temp_file:temp_file.write("临时内容")temp_file.seek(0)print(temp_file.read())# 创建临时目录
with tempfile.TemporaryDirectory() as temp_dir:print(f"临时目录: {temp_dir}")# 在临时目录中工作
7. 综合案例
7.1 文件备份工具
import os
import shutil
from datetime import datetimedef backup_file(source_path, backup_dir):"""备份文件到指定目录"""if not os.path.isfile(source_path):print(f"错误: {source_path} 不是文件")return False# 创建备份目录os.makedirs(backup_dir, exist_ok=True)# 生成备份文件名timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")filename = os.path.basename(source_path)backup_name = f"{os.path.splitext(filename)[0]}_{timestamp}{os.path.splitext(filename)[1]}"backup_path = os.path.join(backup_dir, backup_name)try:shutil.copy2(source_path, backup_path)print(f"备份成功: {backup_path}")return Trueexcept Exception as e:print(f"备份失败: {e}")return False# 使用示例
backup_file('important_document.txt', './backups')
7.2 目录大小计算
def get_directory_size(directory):"""计算目录总大小"""total_size = 0for dirpath, dirnames, filenames in os.walk(directory):for filename in filenames:filepath = os.path.join(dirpath, filename)if os.path.isfile(filepath):total_size += os.path.getsize(filepath)return total_sizedef format_size(size_bytes):"""格式化文件大小"""for unit in ['B', 'KB', 'MB', 'GB']:if size_bytes < 1024.0:return f"{size_bytes:.2f} {unit}"size_bytes /= 1024.0return f"{size_bytes:.2f} TB"# 使用示例
directory = '.'
size = get_directory_size(directory)
print(f"目录 {directory} 大小: {format_size(size)}")
7.3 文件查找工具
def find_files(directory, pattern=None, file_type='both'):"""在目录中查找文件file_type: 'file', 'dir', 'both'"""matches = []for root, dirs, files in os.walk(directory):if file_type in ['file', 'both']:for file in files:if pattern is None or pattern in file:matches.append(os.path.join(root, file))if file_type in ['dir', 'both']:for dir_name in dirs:if pattern is None or pattern in dir_name:matches.append(os.path.join(root, dir_name))return matches# 使用示例
python_files = find_files('.', '.py', 'file')
print("找到的Python文件:")
for file in python_files:print(f" {file}")
8. 重要注意事项
8.1 安全性
# 不安全的路径拼接(可能遭受路径遍历攻击)user_input = "../../etc/passwd"unsafe_path = os.path.join('/safe/dir', user_input) # 危险!# 安全的路径处理def safe_join(base_dir, user_path):full_path = os.path.join(base_dir, user_path)full_path = os.path.normpath(full_path)if not full_path.startswith(os.path.abspath(base_dir)):raise ValueError("路径遍历攻击检测!")return full_path
8.2 错误处理
import errnodef safe_file_operations():try:# 文件操作with open('file.txt', 'r') as f:content = f.read()# 目录操作os.mkdir('new_dir')except FileNotFoundError:print("文件或目录不存在")except PermissionError:print("权限不足")except OSError as e:if e.errno == errno.ENOSPC:print("磁盘空间不足")else:print(f"系统错误: {e}")except Exception as e:print(f"未知错误: {e}")safe_file_operations()
8.3 跨平台兼容性
# 使用 os.path 处理路径,不要硬编码分隔符bad_path = "folder\\subfolder\\file.txt" # Windows专用good_path = os.path.join("folder", "subfolder", "file.txt") # 跨平台# 检查操作系统if os.name == 'nt': # Windowsprint("运行在Windows系统")elif os.name == 'posix': # Linux/Unix/Macprint("运行在Unix-like系统")
Python OS 模块的主要功能,使用时需要注意错误处理、安全性和跨平台兼容性。