一、什么是 os 模块?
os 模块是 Python 标准库中与操作系统交互的接口,可以让你在 Python 程序中执行文件和目录操作、获取系统信息等。
二、导入模块
import os
三、基础操作详解
- 获取当前工作目录
import os
# 获取当前工作目录
current_dir = os.getcwd()
print(f"当前目录是: {current_dir}")
# 输出示例: C:\Users\YourName\Documents (Windows)
# 或 /home/yourname (Linux/Mac)
- 改变工作目录
# 改变当前工作目录
os.chdir('/path/to/new/directory')
print(f"新目录: {os.getcwd()}")
# 切换到上级目录
os.chdir('..')
- 列出目录内容
# 列出当前目录下的所有文件和文件夹
contents = os.listdir('.')
print(f"当前目录内容: {contents}")
# 列出指定目录
files = os.listdir('/path/to/directory')
# 只列出文件(不包括目录)
only_files = [f for f in os.listdir('.') if os.path.isfile(f)]
# 只列出目录
only_dirs = [d for d in os.listdir('.') if os.path.isdir(d)]
- 创建目录
# 创建单个目录
os.mkdir('new_folder')
# 创建多级目录(推荐)
os.makedirs('parent/child/grandchild')
# 即使 parent 和 child 不存在也会创建
# 如果目录已存在不报错
os.makedirs('existing_folder', exist_ok=True)
- 删除文件和目录
# 删除文件
os.remove('file.txt')
# 删除空目录
os.rmdir('empty_folder')
# 删除多级空目录
os.removedirs('parent/child/grandchild')
# 注意:这些方法只能删除空目录,要删除非空目录需要用 shutil 模块
import shutil
shutil.rmtree('non_empty_folder')
- 重命名文件/目录
# 重命名
os.rename('old_name.txt', 'new_name.txt')
# 移动文件(重命名也可以用来移动)
os.rename('file.txt', '/new/path/file.txt')
# 更安全的移动(跨文件系统)
os.replace('file.txt', '/new/path/file.txt')
四、路径操作
- os.path 子模块
# 路径拼接(推荐,自动处理分隔符)
path = os.path.join('folder', 'subfolder', 'file.txt')
print(path) # folder/subfolder/file.txt (Linux/Mac)
# folder\subfolder\file.txt (Windows)
# 获取绝对路径
abs_path = os.path.abspath('file.txt')
# 获取目录名和文件名
dir_name = os.path.dirname('/path/to/file.txt') # /path/to
base_name = os.path.basename('/path/to/file.txt') # file.txt
# 分割路径和扩展名
path_without_ext, ext = os.path.splitext('file.txt')
print(path_without_ext) # file
print(ext) # .txt
# 检查路径是否存在
exists = os.path.exists('file.txt')
# 判断是文件还是目录
is_file = os.path.isfile('file.txt')
is_dir = os.path.isdir('folder')
# 获取文件大小(字节)
size = os.path.getsize('file.txt')
五、实用示例
示例 1:批量重命名文件
import os
def batch_rename(folder_path, prefix):
"""给文件夹内所有文件添加前缀"""
try:
# 切换到目标文件夹
os.chdir(folder_path)
# 遍历所有文件
for filename in os.listdir('.'):
if os.path.isfile(filename):
new_name = prefix + filename
os.rename(filename, new_name)
print(f"重命名: {filename} -> {new_name}")
print("重命名完成!")
except Exception as e:
print(f"出错: {e}")
# 使用示例
# batch_rename('/path/to/folder', 'new_')
示例 2:遍历目录树
import os
def walk_through_files(path):
"""遍历目录树,显示所有文件"""
for root, dirs, files in os.walk(path):
print(f"\n当前目录: {root}")
if dirs:
print(f"子目录: {dirs}")
if files:
print("文件:")
for file in files:
file_path = os.path.join(root, file)
size = os.path.getsize(file_path)
print(f" - {file} ({size} bytes)")
# 使用示例
# walk_through_files('.')
示例 3:文件分类整理器
import os
import shutil
def organize_files(folder_path):
"""根据文件扩展名分类整理文件"""
# 定义分类规则
categories = {
'图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp'],
'文档': ['.pdf', '.doc', '.docx', '.txt', '.xlsx'],
'视频': ['.mp4', '.avi', '.mov', '.mkv'],
'音频': ['.mp3', '.wav', '.flac', '.aac'],
'压缩包': ['.zip', '.rar', '.7z', '.tar', '.gz']
}
# 创建分类文件夹
for category in categories:
os.makedirs(os.path.join(folder_path, category), exist_ok=True)
# 遍历文件
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
# 跳过目录
if os.path.isdir(file_path):
continue
# 获取扩展名并分类
ext = os.path.splitext(filename)[1].lower()
for category, extensions in categories.items():
if ext in extensions:
dest_folder = os.path.join(folder_path, category)
shutil.move(file_path, os.path.join(dest_folder, filename))
print(f"移动 {filename} -> {category}/")
break
# 使用示例
# organize_files('/path/to/your/folder')
示例 4:获取文件信息
import os
import time
from datetime import datetime
def get_file_info(file_path):
"""获取文件的详细信息"""
if not os.path.exists(file_path):
return "文件不存在"
# 文件基本信息
file_name = os.path.basename(file_path)
file_size = os.path.getsize(file_path)
# 时间信息
create_time = os.path.getctime(file_path) # 创建时间
modify_time = os.path.getmtime(file_path) # 修改时间
access_time = os.path.getatime(file_path) # 访问时间
# 格式化时间
def format_time(timestamp):
return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
info = f"""
文件信息:
文件名: {file_name}
路径: {os.path.abspath(file_path)}
大小: {file_size:,} 字节 ({file_size/1024:.2f} KB)
创建时间: {format_time(create_time)}
修改时间: {format_time(modify_time)}
访问时间: {format_time(access_time)}
是否为文件: {os.path.isfile(file_path)}
是否为目录: {os.path.isdir(file_path)}
"""
return info
# 使用示例
# print(get_file_info('test.txt'))
六、环境变量和系统信息
import os
# 获取所有环境变量
env_vars = os.environ
# 获取特定环境变量
path = os.environ.get('PATH')
home = os.environ.get('HOME') # Linux/Mac
# home = os.environ.get('USERPROFILE') # Windows
# 获取系统信息
print(f"操作系统名称: {os.name}") # posix (Linux/Mac) 或 nt (Windows)
print(f"路径分隔符: {os.sep}")
print(f"行分隔符: {os.linesep}")
print(f"当前用户: {os.getlogin()}")
七、执行系统命令
# 执行系统命令
os.system('echo Hello World') # 简单但不推荐
# 更推荐的方式
result = os.popen('dir').read() # Windows
# result = os.popen('ls -la').read() # Linux/Mac
print(result)
完整项目示例:文件备份工具
import os
import shutil
from datetime import datetime
class FileBackup:
def __init__(self, source_dir, backup_dir):
self.source_dir = source_dir
self.backup_dir = backup_dir
def create_backup(self):
"""创建备份"""
try:
# 创建备份文件夹(以时间戳命名)
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup_folder = os.path.join(self.backup_dir, f'backup_{timestamp}')
print(f"开始备份到: {backup_folder}")
# 复制整个目录树
shutil.copytree(self.source_dir, backup_folder)
# 生成备份报告
report = self.generate_report(backup_folder)
# 保存报告
report_path = os.path.join(backup_folder, 'backup_report.txt')
with open(report_path, 'w', encoding='utf-8') as f:
f.write(report)
print("备份完成!")
return backup_folder
except Exception as e:
print(f"备份失败: {e}")
return None
def generate_report(self, backup_path):
"""生成备份报告"""
total_files = 0
total_size = 0
for root, dirs, files in os.walk(backup_path):
total_files += len(files)
for file in files:
file_path = os.path.join(root, file)
total_size += os.path.getsize(file_path)
report = f"""
备份报告
================
源目录: {self.source_dir}
备份位置: {backup_path}
备份时间: {datetime.now()}
文件总数: {total_files}
总大小: {total_size / (1024*1024):.2f} MB
================
"""
return report
def list_backups(self):
"""列出所有备份"""
backups = []
for item in os.listdir(self.backup_dir):
item_path = os.path.join(self.backup_dir, item)
if os.path.isdir(item_path) and item.startswith('backup_'):
size = self.get_folder_size(item_path)
backups.append((item, size))
return sorted(backups, reverse=True)
def get_folder_size(self, folder_path):
"""计算文件夹大小"""
total_size = 0
for dirpath, dirnames, filenames in os.walk(folder_path):
for f in filenames:
fp = os.path.join(dirpath, f)
total_size += os.path.getsize(fp)
return total_size
# 使用示例
if __name__ == "__main__":
# 创建备份工具实例
backup_tool = FileBackup('./my_files', './backups')
# 创建备份
backup_path = backup_tool.create_backup()
# 列出所有备份
backups = backup_tool.list_backups()
for name, size in backups:
print(f"{name}: {size / (1024*1024):.2f} MB")