26人参与 • 2026-07-31 • Python
在日常开发中,文件操作是程序员绕不开的基础技能之一。无论是处理日志、批量整理数据,还是自动化脚本管理,我们都需要对文件进行**重命名(rename)和删除(remove)**等操作。而 os 模块作为 python 提供的核心模块之一,为我们提供了强大且底层的系统级文件操作能力。
今天,我们就来深入学习如何使用 os 模块完成这些常见但至关重要的任务。本文将带你从基础语法到实战技巧,涵盖多种场景下的代码示例,并通过可视化图表帮助你理解流程逻辑。无论你是初学者还是有一定经验的开发者,都能从中收获实用知识。
os 模块是 python 标准库中的核心模块之一,它封装了操作系统相关的功能。它的设计哲学是“贴近系统底层”,这意味着你可以直接调用操作系统提供的接口,实现更灵活、更高效的文件操作。
相比于 pathlib(python 3.4+ 推荐),os 更加简洁、高效,尤其适合需要跨平台兼容性或性能敏感的场景。虽然 pathlib 在路径处理上更加面向对象,但在文件重命名与删除这类操作中,os 依然具有不可替代的优势。
函数原型
os.rename(src, dst)
src: 原始文件路径(源)dst: 新文件路径(目标)注意:如果目标路径已存在,会抛出 fileexistserror 异常!
示例1:简单重命名文件
import os
# 假设当前目录下有一个名为 'old_file.txt' 的文件
try:
os.rename('old_file.txt', 'new_file.txt')
print("✅ 文件重命名成功!")
except filenotfounderror:
print("❌ 源文件不存在!")
except fileexistserror:
print("❌ 目标文件已存在,无法重命名。")
重命名的注意事项
permissionerror。很多时候我们需要对多个文件进行统一重命名。比如将一组照片按日期命名,或清理命名混乱的文档。
示例2:批量重命名图片文件
import os
def batch_rename_images(folder_path, prefix="image_"):
"""
批量重命名指定文件夹内的图片文件
:param folder_path: 图片文件夹路径
:param prefix: 新文件名前缀
"""
# 获取文件夹中所有文件
files = os.listdir(folder_path)
# 过滤出图片文件(可扩展为更多格式)
image_extensions = {'.jpg', '.jpeg', '.png', '.bmp', '.gif'}
image_files = [f for f in files if os.path.splitext(f)[1].lower() in image_extensions]
# 按照顺序重命名
for index, filename in enumerate(image_files, start=1):
old_path = os.path.join(folder_path, filename)
new_filename = f"{prefix}{index:03d}.jpg" # 三位数字补零
new_path = os.path.join(folder_path, new_filename)
try:
os.rename(old_path, new_path)
print(f"🔄 已重命名: {filename} → {new_filename}")
except exception as e:
print(f"❌ 重命名失败 {filename}: {e}")
# 调用函数
batch_rename_images("./photos", "photo_")
输出示例:
🔄 已重命名: img001.jpg → photo_001.jpg
🔄 已重命名: img002.png → photo_002.jpg
...
小贴士:使用 f"{index:03d}" 可以保证编号始终为三位数,便于排序。
很多人容易混淆“移动”和“重命名”。其实,在同一磁盘内,os.rename() 实际上就是“移动+重命名”的合体。
示例3:在同一盘符内移动文件(相当于重命名)
import os
source = "./downloads/file.pdf"
destination = "./documents/file.pdf"
try:
os.rename(source, destination)
print("✅ 文件已移动至新位置(同盘符)")
except oserror as e:
print(f"❌ 移动失败:{e}")
重要提醒:如果 source 和 destination 不在同一磁盘分区,os.rename() 会失败。此时应使用 shutil.move()。
函数原型
os.remove(path)
path: 要删除的文件路径
该函数仅适用于文件,不能删除目录!
示例4:安全删除单个文件
import os
file_path = "temp.log"
if os.path.exists(file_path):
try:
os.remove(file_path)
print("🗑️ 文件删除成功!")
except permissionerror:
print("❌ 无权限删除该文件!")
except oserror as e:
print(f"❌ 删除失败:{e}")
else:
print("🔍 文件不存在,无需删除。")
import os
dir_path = "./empty_folder"
if os.path.exists(dir_path) and os.path.isdir(dir_path):
try:
os.rmdir(dir_path)
print("🗑️ 空目录删除成功!")
except oserror as e:
print(f"❌ 删除失败:{e}")
else:
print("🔍 目录不存在或不是空目录。")
仅能删除空目录,否则报错。
import os
nested_dir = "./project/temp/cache"
if os.path.exists(nested_dir):
try:
os.removedirs(nested_dir)
print("🗑️ 递归删除整个目录结构成功!")
except oserror as e:
print(f"❌ 删除失败:{e}")
else:
print("🔍 目录不存在。")
特点:自动逐级删除子目录,直到根目录为空为止。
注意:如果某一层非空,则不会继续删除,保留该层结构。
在某些自动化脚本中,我们需要先重命名文件,再根据条件删除旧版本。
示例5:版本清理脚本
import os
import re
def clean_old_versions(folder_path, pattern=r"backup_\d+\.zip"):
"""
删除符合正则模式的旧备份文件
:param folder_path: 备份文件所在目录
:param pattern: 匹配规则
"""
files = os.listdir(folder_path)
matched_files = [f for f in files if re.match(pattern, f)]
if not matched_files:
print("🔍 未找到匹配的旧版本文件。")
return
# 先重命名,避免误删
for filename in matched_files:
old_path = os.path.join(folder_path, filename)
new_name = f"old_{filename}"
new_path = os.path.join(folder_path, new_name)
try:
os.rename(old_path, new_path)
print(f"🔄 重命名旧文件: {filename} → {new_name}")
except exception as e:
print(f"❌ 重命名失败: {e}")
# 再删除
for filename in matched_files:
old_path = os.path.join(folder_path, f"old_{filename}")
try:
os.remove(old_path)
print(f"🗑️ 已删除: {filename}")
except exception as e:
print(f"❌ 删除失败: {e}")
# 执行清理
clean_old_versions("./backups", r"backup_\d+\.zip")
应用场景:
在进行文件操作时,异常处理至关重要。以下是一些常见异常及应对策略:
| 异常类型 | 可能原因 | 解决方案 |
|---|---|---|
filenotfounderror | 源文件不存在 | 添加 os.path.exists() 判断 |
fileexistserror | 目标文件已存在 | 提前删除或改名 |
permissionerror | 权限不足 | 检查用户权限或以管理员运行 |
oserror | 系统错误(如磁盘满) | 打印详细错误信息,提示用户 |
示例6:带完整异常处理的通用重命名函数
import os
def safe_rename(src, dst):
"""
安全地重命名文件,包含完整异常处理
"""
# 检查源文件是否存在
if not os.path.exists(src):
print(f"❌ 源文件不存在: {src}")
return false
# 检查目标是否已存在
if os.path.exists(dst):
print(f"❌ 目标文件已存在: {dst}")
return false
# 检查是否为文件
if not os.path.isfile(src):
print(f"❌ 源路径不是文件: {src}")
return false
try:
os.rename(src, dst)
print(f"✅ 成功重命名: {src} → {dst}")
return true
except permissionerror:
print("❌ 权限不足,无法重命名。")
return false
except oserror as e:
print(f"❌ 系统错误: {e}")
return false
except exception as e:
print(f"❌ 未知错误: {e}")
return false
# 使用示例
safe_rename("old.txt", "new.txt")
在编写自动化脚本时,务必加入防护机制,避免误删重要文件。
推荐做法:
os.path.exists() 验证路径。y 才执行)。示例7:带确认的删除脚本
import os
def confirm_delete(file_path):
if not os.path.exists(file_path):
print("🔍 文件不存在。")
return
print(f"⚠️ 即将删除文件: {file_path}")
user_input = input("请输入 'yes' 确认删除: ").strip().lower()
if user_input == 'yes':
try:
os.remove(file_path)
print("🗑️ 文件已成功删除。")
except exception as e:
print(f"❌ 删除失败: {e}")
else:
print("🛑 操作已取消。")
# 使用
confirm_delete("important_backup.zip")
os 模块的设计初衷就是跨平台。以下是一些关键点:
| 平台 | 路径分隔符 | 例子 |
|---|---|---|
| windows | \ 或 / | c:\data\file.txt |
| unix/linux/macos | / | /home/user/data.txt |
os.path 模块会自动适配当前系统路径分隔符。
示例8:跨平台路径拼接
import os base_dir = "data" filename = "config.json" full_path = os.path.join(base_dir, filename) print(full_path) # 输出:data/config.json (macos/linux) 或 data\config.json (windows)
以下是几个实用的工具函数,可直接用于你的项目中:
def is_valid_file(path):
return os.path.exists(path) and os.path.isfile(path)
def get_file_size(path):
if is_valid_file(path):
return os.path.getsize(path)
return 0
import time
def get_file_mtime(path):
if is_valid_file(path):
return time.ctime(os.path.getmtime(path))
return none
def delete_files_by_ext(folder, ext):
deleted = 0
for file in os.listdir(folder):
if file.lower().endswith(ext.lower()):
try:
os.remove(os.path.join(folder, file))
deleted += 1
except:
pass
print(f"🗑️ 已删除 {deleted} 个 {ext} 文件。")
每天生成一个新日志文件,旧日志重命名并压缩。
import os
from datetime import datetime
def rotate_log(log_dir="logs"):
log_file = os.path.join(log_dir, "app.log")
if os.path.exists(log_file):
timestamp = datetime.now().strftime("%y%m%d_%h%m%s")
backup_name = f"app_{timestamp}.log"
backup_path = os.path.join(log_dir, backup_name)
os.rename(log_file, backup_path)
print(f"🔁 日志已轮转至: {backup_path}")
import os
import time
def cleanup_temp_folder(temp_dir="./tmp", max_age_hours=24):
now = time.time()
threshold = now - (max_age_hours * 3600)
for file in os.listdir(temp_dir):
file_path = os.path.join(temp_dir, file)
if os.path.isfile(file_path):
mtime = os.path.getmtime(file_path)
if mtime < threshold:
try:
os.remove(file_path)
print(f"🗑️ 清理过期文件: {file}")
except:
pass
| 技能点 | 推荐做法 |
|---|---|
| 重命名文件 | 使用 os.rename(),注意路径与权限 |
| 删除文件 | 使用 os.remove(),先验证存在性 |
| 删除目录 | os.rmdir()(空目录)、os.removedirs()(递归) |
| 异常处理 | 始终包裹 try-except,提供友好提示 |
| 安全性 | 加入确认、预览、备份机制 |
| 跨平台 | 使用 os.path.join() 和 os.sep |
文件的重命名与删除看似简单,实则蕴含大量细节与潜在风险。通过合理使用 os 模块,我们可以写出高效、健壮的自动化脚本。
记住:每一次文件操作,都可能是不可逆的。因此,请保持谨慎,善用异常处理与安全机制。
愿你在编程路上,既能优雅地“搬砖”,也能从容地“删库”。
到此这篇关于python使用os模块实现文件重命名与删除操作的文章就介绍到这了,更多相关python文件重命名与删除内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论