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 shutil
shutil.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_mode
if 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 datetime
def 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 True
except Exception as e:
print(f"备份失败: {e}")
return False
# 使用示例
backup_file('important_document.txt', './backups')
7.2 目录大小计算
def get_directory_size(directory):
"""计算目录总大小"""
total_size = 0
for 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_size
def 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.0
return 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 errno
def 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': # Windows
print("运行在Windows系统")
elif os.name == 'posix': # Linux/Unix/Mac
print("运行在Unix-like系统")
Python OS 模块的主要功能,使用时需要注意错误处理、安全性和跨平台兼容性。
更多推荐
所有评论(0)