Python文件批量重命名小工具的实现与分享
Python 新人,写了一个批量重命名文件的小工具
发布在 Github 上: https://github.com/guiqiqi/allRename
希望大家用的开心~,也欢迎大家对代码进行修改~
Python文件批量重命名小工具的实现与分享
留个脚印
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
谢谢支持🙏


