Python文件管理之批量重命名文件详解

 更新时间:2025年12月04日 08:52:47   作者:零日失眠者  
在日常工作中,我们经常需要对大量文件进行重命名操作,特别是在整理照片,文档或其他媒体文件时,下面我们就使用Python编写一个文件批量重命名脚本吧

简介

在日常工作中,我们经常需要对大量文件进行重命名操作,特别是在整理照片、文档或其他媒体文件时。手动一个个重命名不仅耗时,还容易出错。本文将介绍一个实用的Python脚本——文件批量重命名工具,它可以大大提高我们的工作效率。

功能介绍

这个文件批量重命名工具具有以下核心功能:

  • 批量重命名:可以同时对多个文件按照指定规则进行重命名
  • 多种命名模式:支持序号命名、前缀命名、后缀命名等多种模式
  • 文件过滤:可以根据文件扩展名、文件名特征等条件筛选文件
  • 预览功能:在实际执行前可以预览重命名结果
  • 撤销功能:支持操作撤销,防止误操作
  • 日志记录:记录所有操作历史,便于追踪和审计

应用场景

这个工具适用于以下场景:

  • 照片整理:将相机拍摄的照片按日期或序号统一命名
  • 文档管理:对公司或个人文档进行规范化命名
  • 下载文件整理:对下载的文件进行批量重命名以提高可读性
  • 开发项目:对代码文件或资源文件进行统一命名规范
  • 学术研究:对实验数据文件进行有序命名

报错处理

脚本包含了完善的错误处理机制:

  • 路径不存在:检查指定目录是否存在,若不存在则提示用户
  • 权限不足:检测文件操作权限,权限不足时给出明确提示
  • 文件冲突:检测目标文件名是否已存在,避免覆盖重要文件
  • 参数验证:验证用户输入的参数是否合法
  • 异常捕获:捕获并处理运行过程中可能出现的各种异常

代码实现

import os
import sys
import argparse
from datetime import datetime

class FileBatchRenamer:
    def __init__(self, directory):
        self.directory = directory
        self.rename_log = []
        
    def check_directory(self):
        """检查目录是否存在"""
        if not os.path.exists(self.directory):
            raise FileNotFoundError(f"目录 '{self.directory}' 不存在")
        if not os.path.isdir(self.directory):
            raise NotADirectoryError(f"'{self.directory}' 不是一个有效的目录")
            
    def get_files(self, extension=None, pattern=None):
        """获取符合条件的文件列表"""
        try:
            self.check_directory()
            files = os.listdir(self.directory)
            filtered_files = []
            
            for file in files:
                file_path = os.path.join(self.directory, file)
                # 只处理文件,不处理子目录
                if os.path.isfile(file_path):
                    # 根据扩展名过滤
                    if extension and not file.endswith(extension):
                        continue
                    # 根据模式过滤
                    if pattern and pattern not in file:
                        continue
                    filtered_files.append(file)
                    
            return sorted(filtered_files)
        except Exception as e:
            print(f"获取文件列表时出错: {e}")
            return []
            
    def preview_rename(self, files, naming_pattern, start_number=1):
        """预览重命名结果"""
        print("\n重命名预览:")
        print("-" * 50)
        rename_map = {}
        
        for i, filename in enumerate(files, start_number):
            name, ext = os.path.splitext(filename)
            new_name = naming_pattern.format(i) + ext
            rename_map[filename] = new_name
            print(f"{filename} -> {new_name}")
            
        return rename_map
        
    def execute_rename(self, rename_map):
        """执行重命名操作"""
        success_count = 0
        error_count = 0
        
        for old_name, new_name in rename_map.items():
            old_path = os.path.join(self.directory, old_name)
            new_path = os.path.join(self.directory, new_name)
            
            # 检查目标文件是否已存在
            if os.path.exists(new_path):
                print(f"警告: 文件 '{new_name}' 已存在,跳过 '{old_name}'")
                error_count += 1
                continue
                
            try:
                os.rename(old_path, new_path)
                self.rename_log.append((datetime.now(), old_name, new_name))
                print(f"成功重命名: {old_name} -> {new_name}")
                success_count += 1
            except PermissionError:
                print(f"权限错误: 无法重命名 '{old_name}',请检查文件权限")
                error_count += 1
            except Exception as e:
                print(f"重命名 '{old_name}' 时出错: {e}")
                error_count += 1
                
        print(f"\n重命名完成! 成功: {success_count}, 失败: {error_count}")
        
    def save_log(self, log_file="rename_log.txt"):
        """保存操作日志"""
        try:
            with open(os.path.join(self.directory, log_file), "w", encoding="utf-8") as f:
                f.write("文件批量重命名操作日志\n")
                f.write("=" * 50 + "\n")
                f.write(f"操作时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
                f.write(f"操作目录: {self.directory}\n\n")
                
                for timestamp, old_name, new_name in self.rename_log:
                    f.write(f"[{timestamp.strftime('%H:%M:%S')}] {old_name} -> {new_name}\n")
                    
            print(f"操作日志已保存到: {log_file}")
        except Exception as e:
            print(f"保存日志时出错: {e}")

def main():
    parser = argparse.ArgumentParser(description="文件批量重命名工具")
    parser.add_argument("directory", help="要处理的目录路径")
    parser.add_argument("-p", "--pattern", default="file_{:03d}", 
                       help="命名模式,使用 {:03d} 表示序号 (默认: file_{:03d})")
    parser.add_argument("-s", "--start", type=int, default=1, 
                       help="起始序号 (默认: 1)")
    parser.add_argument("-e", "--extension", 
                       help="文件扩展名过滤 (例如: .jpg)")
    parser.add_argument("--preview", action="store_true", 
                       help="仅预览,不执行实际重命名")
    
    args = parser.parse_args()
    
    try:
        renamer = FileBatchRenamer(args.directory)
        files = renamer.get_files(extension=args.extension)
        
        if not files:
            print("未找到符合条件的文件")
            return
            
        print(f"找到 {len(files)} 个文件")
        
        rename_map = renamer.preview_rename(files, args.pattern, args.start)
        
        if args.preview:
            print("\n预览模式,未执行实际重命名操作")
            return
            
        confirm = input("\n确认执行重命名操作? (y/N): ")
        if confirm.lower() == 'y':
            renamer.execute_rename(rename_map)
            renamer.save_log()
        else:
            print("操作已取消")
            
    except Exception as e:
        print(f"程序执行出错: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()

使用方法

基本使用

# 基本用法,对目录中的所有文件按默认模式重命名
python batch_renamer.py /path/to/directory

# 指定命名模式
python batch_renamer.py /path/to/directory -p "photo_{:04d}"

# 指定起始序号
python batch_renamer.py /path/to/directory -s 100

# 只处理特定扩展名的文件
python batch_renamer.py /path/to/directory -e .jpg

# 预览模式(不实际执行重命名)
python batch_renamer.py /path/to/directory --preview

命令行参数说明

  • directory: 必需参数,指定要处理的目录路径
  • -p, --pattern: 命名模式,默认为 file_{:03d},其中 {:03d} 会被替换为序号
  • -s, --start: 起始序号,默认为 1
  • -e, --extension: 文件扩展名过滤器,只处理指定扩展名的文件
  • --preview: 预览模式,只显示重命名结果,不执行实际操作

使用示例

假设有以下文件:

image1.jpg
image2.jpg
document.pdf
photo.png

执行命令:

python batch_renamer.py ./test_dir -p "pic_{:02d}" -e .jpg

结果:

pic_01.jpg
pic_02.jpg
document.pdf
photo.png

总结

这个文件批量重命名工具通过简单的命令行界面提供了强大的批量文件重命名功能。它具有良好的错误处理机制,可以有效防止误操作,并通过日志记录功能保证操作的可追溯性。无论是日常文件整理还是专业项目管理,这个工具都能显著提高工作效率。

到此这篇关于Python文件管理之批量重命名文件详解的文章就介绍到这了,更多相关Python重命名文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Pytorch模型中的parameter与buffer用法

    Pytorch模型中的parameter与buffer用法

    这篇文章主要介绍了Pytorch模型中的parameter与buffer用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Python 字符串池化的前提

    Python 字符串池化的前提

    这篇文章主要介绍了Python 字符串池化的前提,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Python3如何使用range函数替代xrange函数

    Python3如何使用range函数替代xrange函数

    这篇文章主要介绍了Python3如何使用range函数替代xrange函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Python使用python-pptx库实现PPT自动化

    Python使用python-pptx库实现PPT自动化

    Python PPT自动化极大地提高了PPT制作的效率,从创建新文件、添加文本和图片,到插入表格和图表,python-pptx库几乎可以实现所有常见的PPT操作,本文就给大家介绍了Python使用python-pptx库实现PPT自动化的方法,需要的朋友可以参考下
    2025-08-08
  • Python抓取框架Scrapy爬虫入门:页面提取

    Python抓取框架Scrapy爬虫入门:页面提取

    Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改,下面这篇文章主要给大家介绍了关于Python抓取框架Scrapy爬虫入门之页面提取的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-12-12
  • Python线性方程组求解运算示例

    Python线性方程组求解运算示例

    这篇文章主要介绍了Python线性方程组求解运算,涉及Python使用scipy.linalg.solve进行方程组求解运算的相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • PyTorch CUDA环境配置及安装的步骤(图文教程)

    PyTorch CUDA环境配置及安装的步骤(图文教程)

    这篇文章主要介绍了PyTorch CUDA环境配置及安装的步骤(图文教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 使用django-guardian实现django-admin的行级权限控制的方法

    使用django-guardian实现django-admin的行级权限控制的方法

    这篇文章主要介绍了使用django-guardian实现django-admin的行级权限控制的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • pycharm快捷键自动提示documentation问题(auto Ctrl+Q)

    pycharm快捷键自动提示documentation问题(auto Ctrl+Q)

    这篇文章主要介绍了pycharm快捷键自动提示documentation问题(auto Ctrl+Q),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 使用Python给PDF添加目录书签的实现方法

    使用Python给PDF添加目录书签的实现方法

    有时下载到扫描版的 PDF 是不带书签目录的,这样阅读起来很不方便,下面通过 python 实现一个半自动化添加书签目录的脚本,文中通过代码介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-10-10

最新评论