Python使用os模块实现文件重命名与删除操作

 更新时间:2026年07月31日 08:28:22   作者:知远漫谈  
在日常开发中,文件操作是程序员绕不开的基础技能之一,本文介绍了如何使用Python的os模块进行文件重命名和删除操作,涵盖多种场景下的代码示例,希望可以通过可视化图表帮助你理解流程逻辑

在日常开发中,文件操作是程序员绕不开的基础技能之一。无论是处理日志、批量整理数据,还是自动化脚本管理,我们都需要对文件进行**重命名(rename)删除(remove)**等操作。而 os 模块作为 Python 提供的核心模块之一,为我们提供了强大且底层的系统级文件操作能力。

今天,我们就来深入学习如何使用 os 模块完成这些常见但至关重要的任务。本文将带你从基础语法到实战技巧,涵盖多种场景下的代码示例,并通过可视化图表帮助你理解流程逻辑。无论你是初学者还是有一定经验的开发者,都能从中收获实用知识。

一、为什么选择os模块?

os 模块是 Python 标准库中的核心模块之一,它封装了操作系统相关的功能。它的设计哲学是“贴近系统底层”,这意味着你可以直接调用操作系统提供的接口,实现更灵活、更高效的文件操作。

相比于 pathlib(Python 3.4+ 推荐),os 更加简洁、高效,尤其适合需要跨平台兼容性或性能敏感的场景。虽然 pathlib 在路径处理上更加面向对象,但在文件重命名与删除这类操作中,os 依然具有不可替代的优势。

二、基本文件重命名:os.rename()

函数原型

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("❌ 目标文件已存在,无法重命名。")

重命名的注意事项

  1. 路径必须正确:相对路径或绝对路径均可,但需确保路径有效。
  2. 权限问题:若没有写入权限,会引发 PermissionError
  3. 跨盘符重命名不支持:不能在不同磁盘之间移动文件(如 C:\ → D:\),必须先复制再删除。

三、高级重命名技巧:批量重命名文件

很多时候我们需要对多个文件进行统一重命名。比如将一组照片按日期命名,或清理命名混乱的文档。

示例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}")

重要提醒:如果 sourcedestination 不在同一磁盘分区,os.rename() 会失败。此时应使用 shutil.move()

五、文件删除操作:os.remove()

函数原型

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("🔍 文件不存在,无需删除。")

六、删除目录:os.rmdir()与os.removedirs()

os.rmdir(path)—— 删除空目录

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("🔍 目录不存在或不是空目录。")

仅能删除空目录,否则报错。

os.removedirs(path)—— 递归删除目录树

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")

应用场景

  • 定期清理临时备份
  • 日志轮转(log rotation)
  • 项目构建后清理中间产物

八、异常处理最佳实践

在进行文件操作时,异常处理至关重要。以下是一些常见异常及应对策略:

异常类型可能原因解决方案
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")

九、安全性建议:防止误删

在编写自动化脚本时,务必加入防护机制,避免误删重要文件。

推荐做法:

  1. 启用“预览模式”:先打印要操作的文件列表,确认无误后再执行。
  2. 使用 os.path.exists() 验证路径
  3. 添加确认步骤(如输入 y 才执行)。
  4. 备份原始文件(特别是生产环境)。

示例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} 文件。")

十二、实际应用场景举例

场景1:日志轮转(Log Rotation)

每天生成一个新日志文件,旧日志重命名并压缩。

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}")

场景2:自动清理临时文件夹

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模块的关键要点

技能点推荐做法
重命名文件使用 os.rename(),注意路径与权限
删除文件使用 os.remove(),先验证存在性
删除目录os.rmdir()(空目录)、os.removedirs()(递归)
异常处理始终包裹 try-except,提供友好提示
安全性加入确认、预览、备份机制
跨平台使用 os.path.join()os.sep

结语

文件的重命名与删除看似简单,实则蕴含大量细节与潜在风险。通过合理使用 os 模块,我们可以写出高效、健壮的自动化脚本。

记住:每一次文件操作,都可能是不可逆的。因此,请保持谨慎,善用异常处理与安全机制。

愿你在编程路上,既能优雅地“搬砖”,也能从容地“删库”。

到此这篇关于Python使用os模块实现文件重命名与删除操作的文章就介绍到这了,更多相关Python文件重命名与删除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python类与实例的使用详解

    Python类与实例的使用详解

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同
    2022-08-08
  • Python的子线程和子进程是如何手动结束的?

    Python的子线程和子进程是如何手动结束的?

    今天给大家带来的是关于Python的相关知识,文章围绕着如何手动结束Python的子线程和子进程展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Python3的正则表达式详解

    Python3的正则表达式详解

    这篇文章主要为大家详细介绍了Python3正则表达式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 使用Python实现屏幕录制与键盘监听功能

    使用Python实现屏幕录制与键盘监听功能

    在Python中,我们可以借助多个强大的库来实现丰富的功能,比如屏幕录制和键盘监听,今天,我们将通过结合PIL、OpenCV、pynput以及threading等库,来实现一个简单的屏幕录制工具,该工具能够通过监听键盘事件来控制录制的开始与结束,需要的朋友可以参考下
    2024-12-12
  • conda使用清华源设置channel的镜像

    conda使用清华源设置channel的镜像

    今天在下载OpenCV的时候发现清华的conda channel镜像已经不能用了,conda需要设置的源是anaconda的源,本来就来介绍一下在conda使用清华源设置channel的镜像的方法,感兴趣的可以了解一下
    2021-05-05
  • jupyter notebook内核启动失败问题及解决方法

    jupyter notebook内核启动失败问题及解决方法

    这篇文章主要介绍了解决jupyter notebook内核启动失败问题,本文给大家介绍了问题原因分析及解决方案,图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • python使用itchat库实现微信机器人(好友聊天、群聊天)

    python使用itchat库实现微信机器人(好友聊天、群聊天)

    itchat是一个开源的微信个人号接口,可以使用该库进行微信网页版中的所有操作。本文主要使用该库完成一个能够处理微信消息的的图灵机器人,包括好友聊天、群聊天,感兴趣的朋友跟随小编一起学习吧
    2018-01-01
  • Python之Pygame的Draw绘图

    Python之Pygame的Draw绘图

    Pygame 中提供了一个draw模块用来绘制一些简单的图形状,比如矩形、多边形、圆形、直线、弧线等。本文主要介绍Pygame中的Draw绘图,感兴趣的同学可以参考阅读
    2023-04-04
  • python中文编码问题小结

    python中文编码问题小结

    这篇文章主要介绍了python中文编码问题,是Python程序设计中比较常见的一类问题,本文以实例形式对此进行了较为详细的总结,需要的朋友可以参考下
    2014-09-09
  • python退出命令是什么?详解python退出方法

    python退出命令是什么?详解python退出方法

    在本篇内容中我们给学习python编程的朋友们整理了关于python退出的命令和方法,需要的学习下。
    2018-12-12

最新评论