Python文件批量重命名小工具的实现与分享

Python 新人,写了一个批量重命名文件的小工具

发布在 Github 上: https://github.com/guiqiqi/allRename

希望大家用的开心~,也欢迎大家对代码进行修改~


Python文件批量重命名小工具的实现与分享
28 回复

留个脚印


import os
import re
from pathlib import Path
from datetime import datetime

class BatchRenamer:
    def __init__(self, directory):
        self.directory = Path(directory)
        if not self.directory.exists():
            raise FileNotFoundError(f"目录不存在: {directory}")
    
    def rename_by_pattern(self, pattern, replacement, use_regex=False):
        """按模式重命名"""
        renamed_files = []
        
        for file_path in self.directory.iterdir():
            if file_path.is_file():
                old_name = file_path.name
                
                if use_regex:
                    try:
                        new_name = re.sub(pattern, replacement, old_name)
                    except re.error:
                        continue
                else:
                    new_name = old_name.replace(pattern, replacement)
                
                if new_name != old_name:
                    new_path = file_path.parent / new_name
                    # 避免文件名冲突
                    counter = 1
                    while new_path.exists():
                        stem = Path(new_name).stem
                        suffix = Path(new_name).suffix
                        new_name = f"{stem}_{counter}{suffix}"
                        new_path = file_path.parent / new_name
                        counter += 1
                    
                    file_path.rename(new_path)
                    renamed_files.append((old_name, new_name))
        
        return renamed_files
    
    def add_prefix_suffix(self, prefix="", suffix=""):
        """添加前后缀"""
        renamed_files = []
        
        for file_path in self.directory.iterdir():
            if file_path.is_file():
                old_name = file_path.name
                stem = file_path.stem
                ext = file_path.suffix
                new_name = f"{prefix}{stem}{suffix}{ext}"
                
                if new_name != old_name:
                    new_path = file_path.parent / new_name
                    # 处理重名
                    counter = 1
                    while new_path.exists():
                        new_name = f"{prefix}{stem}{suffix}_{counter}{ext}"
                        new_path = file_path.parent / new_name
                        counter += 1
                    
                    file_path.rename(new_path)
                    renamed_files.append((old_name, new_name))
        
        return renamed_files
    
    def sequential_rename(self, base_name, start_num=1, digits=3):
        """顺序重命名"""
        renamed_files = []
        files = sorted([f for f in self.directory.iterdir() if f.is_file()])
        
        for i, file_path in enumerate(files, start=start_num):
            old_name = file_path.name
            ext = file_path.suffix
            num_str = str(i).zfill(digits)
            new_name = f"{base_name}_{num_str}{ext}"
            
            new_path = file_path.parent / new_name
            # 直接覆盖式重命名,因为我们是按顺序处理的
            file_path.rename(new_path)
            renamed_files.append((old_name, new_name))
        
        return renamed_files
    
    def change_extension(self, new_ext):
        """修改文件扩展名"""
        if not new_ext.startswith("."):
            new_ext = "." + new_ext
        
        renamed_files = []
        
        for file_path in self.directory.iterdir():
            if file_path.is_file():
                old_name = file_path.name
                stem = file_path.stem
                new_name = f"{stem}{new_ext}"
                
                if new_name != old_name:
                    new_path = file_path.parent / new_name
                    counter = 1
                    while new_path.exists():
                        new_name = f"{stem}_{counter}{new_ext}"
                        new_path = file_path.parent / new_name
                        counter += 1
                    
                    file_path.rename(new_path)
                    renamed_files.append((old_name, new_name))
        
        return renamed_files

# 使用示例
if __name__ == "__main__":
    # 初始化重命名器
    renamer = BatchRenamer("./test_files")
    
    # 示例1: 替换文件名中的特定文本
    print("替换操作:")
    result = renamer.rename_by_pattern("old_", "new_")
    for old, new in result:
        print(f"  {old} -> {new}")
    
    # 示例2: 添加前后缀
    print("\n添加前后缀:")
    result = renamer.add_prefix_suffix(prefix="pre_", suffix="_suf")
    for old, new in result:
        print(f"  {old} -> {new}")
    
    # 示例3: 顺序重命名
    print("\n顺序重命名:")
    result = renamer.sequential_rename("document", start_num=1, digits=4)
    for old, new in result:
        print(f"  {old} -> {new}")
    
    # 示例4: 修改扩展名
    print("\n修改扩展名:")
    result = renamer.change_extension(".txt")
    for old, new in result:
        print(f"  {old} -> {new}")
    
    # 示例5: 使用正则表达式
    print("\n使用正则表达式:")
    result = renamer.rename_by_pattern(r"\d+", "NUM", use_regex=True)
    for old, new in result:
        print(f"  {old} -> {new}")

这个批量重命名工具提供了几种常见的重命名方式:模式替换、添加前后缀、顺序编号、修改扩展名,还支持正则表达式。核心是BatchRenamer类,每个方法都返回重命名前后的文件名列表方便查看结果。代码处理了文件名冲突的情况,避免覆盖现有文件。

用的时候先创建BatchRenamer对象指定目录,然后调用对应的方法就行。记得在实际使用前最好先备份文件,或者在测试目录里试一下。

简单说就是:按需调用对应方法,注意先备份。

mark

也可以直接试试 perl 几行的脚本

能改什么?没功能说明啊

我期望有一个改名工具有下列特殊功能,目前不是没有改名工具可以做,是分散在不同改名工具
1.正则&正则模板,递增规则可扩展到数字和大小写(就是 62 进制)
2.按日期时间改名(其中有当前时间 NOW,几乎没工具能做这个)
3.按文件 CRC32 或其他 HASH 值改名(仅限文件,多线程,不然很慢)
4.按总文件数、总字节数改名(仅限目录,递归多层)
5.按指定编码转换(目前仅见过一个台湾人做了这个)
6.按一个文本给一堆文件改名,按行对应(美剧按视频文件名改字幕文件名很方便,目前只有两三个工具有这个)
7.可联网获取相关信息改名,嗯,停车场太大找车不容易啊
8.什么大驼峰小驼峰的
9.什么 mp3tag, mp4tag, exif 那些我就不说了
……
当然上述各项可组合,每次只能改其中一项也是废的

人生苦短,我用 rename

这个工具就是组合各种规则改名的,抱歉我没有在介绍中很好的说明,只是因为自己想不到这些东西,现在功能还很弱,你说的这些规则我会慢慢的添加进去的

嗯嗯,我知道很多大牛都会用到其他工具,比这个更方便。但是我想就是能给普通用户一个比较可视化的界面,让他们能用的舒服一些。

楼主听说过水淼·文件批量处理器吗

之前没有听说过,刚刚去看了一下,功能确实很强大,其中关于文件重命名的功能我会慢慢加以改进加进来的,关于文件写入功能不打算添加,因为这只是一个重命名工具。

完全不能理解 allRename.pyw 的 pyw 有什么意义

还行。也想用 python 搞个这,不过懒,就算了……

ren *.html *.php

windows 下新建记事本 命名为 rename.bat

不谢

人生苦短,我用 rename

rename 还支持正则呢,这个有什么优势吗

赞一个 精神很棒 加油!

当时想的是为以后能扩展一些功能做准备,而且这样写个人觉得看起来更干净(或者说更统一)直接用 UI 启动不是不可以,但是总觉得怪怪的……

这个好像是改后缀用的……

这个工具现在还是一个比较初级的版本,下面根据大家的意见很快就会支持正则,关键是这个能匹配到文件的一些信息,代码中留的有相应的借口,只是当时没有想法还没有实现,可以根据这个去改名会方便一些。谢谢

谢谢啦🙏

怪事,你给我回复我也收不到通知。
再提一个意见,窗口改成可以调整的,不然文件名稍微长一点就显示不完了。

谢谢意见,现在在外面回去就改代码

既然开源了就写好 README

Windows 下一直用一个软件 ant renamer
用起来感觉很不错

好的,谢谢意见,回去加说明

赞一个 精神很棒 加油!

rename ren

谢谢支持🙏

回到顶部