刚刚写的一个批量重命名的一个脚本

HDWiki的数据还原功能有问题,无论点击那个备份文件,他都是从第一个文件开始还原。但总是到第211个文件的时候,出错。我起初以为是一次还原的太多,就想着把300个备份文件分成3份儿。这样的话,第201个,就必须重命名为第1个,才能连着往下还原。所以写了一个简单的脚本来帮我做这件事情:

<think>好的,用户想要编一个用Python批量重命名文件的脚本。之前他们遇到了路径错误的问题,现在需要解决这个问题,同时正确实现重命名功能。首先,我需要回顾用户的历史问题,之前他们在处理YOLOv8训练时出现了FileNotFoundError,路径配置不正确。这可能影响到当前脚本的路径处理部分,需要特别注意路径的验证和存在性检查。 用户提供的引用内容中有一个批量重命名的示例,但需要确保当前脚本符合他们的实际需求。用户可能希望脚本能够灵活处理不同的命名规则,比如添加前缀、序号、后缀或修改扩展名等。此外,用户可能还需要处理特殊文件(如.DS_Store),避免重命名时出错,同时确保文件权限和路径正确。 接下来,我需要考虑用户可能的深层需求。比如,他们可能需要脚本不仅适用于当前目录,还能处理子目录中的文件,或者支持不同的排序方式。此外,用户可能关心脚本的健壮性,例如处理异常、避免覆盖现有文件以及提供回滚功能。 在结构上,脚本应该包含以下部分:导入必要的模块(如os和shutil),定义重命名函数,检查目录是否存在,遍历文件,构造新文件名,处理异常,并提供使用示例。同时,需要添加注释以提高可读性,并允许用户自定义排序方式和命名规则。 还要注意Windows和Linux系统的路径差异,使用原始字符串或双反斜杠来处理路径中的特殊字符。此外,用户可能需要日志记录功能来跟踪重命名的过程,或者在出现错误时能够恢复原文件名。 最后,根据用户之前的问题,确保路径验证部分足够详细,避免再次出现FileNotFoundError。可能需要在脚本中加入更多的错误处理,比如检查文件是否被其他程序占用,或者权限不足的情况。同时,提供相关的使用示例和常见问题解答,帮助用户更好地理解和使用脚本。</think>根据您的需求和路径配置经验,我将为您提供一个改进版的批量重命名脚本,结合了路径验证和容错机制: ### Python批量重命名脚本(增强版) ```python import os import shutil def batch_rename(directory, prefix=None, start_num=1, extension=None, backup=False): """ 增强型文件批量重命名工具 :param directory: 目标目录路径(支持长路径和特殊字符) :param prefix: 文件名前缀(可选) :param start_num: 起始序号(默认1) :param extension: 强制修改扩展名(如'.jpg',可选) :param backup: 是否创建备份(防止误操作) :return: 重命名结果统计 """ # 强化路径验证(参考YOLOv8路径错误解决方案) if not os.path.exists(directory): raise FileNotFoundError(f"[WinError 3] 路径不存在: '{directory}'") # 创建备份目录(如果需要) if backup: backup_dir = os.path.join(directory, "backup_original") os.makedirs(backup_dir, exist_ok=True) for f in os.listdir(directory): src = os.path.join(directory, f) if os.path.isfile(src): shutil.copy2(src, backup_dir) # 获取并过滤文件列表(跳过隐藏文件) files = [f for f in sorted(os.listdir(directory)) if os.path.isfile(os.path.join(directory, f)) and not f.startswith('.')] counter = 0 for idx, filename in enumerate(files, start=start_num): # 原始文件路径 old_path = os.path.join(directory, filename) # 拆分文件名和扩展名 name_part, ext_part = os.path.splitext(filename) # 构建新文件名组件 new_name = [] if prefix: new_name.append(prefix) new_name.append(f"{idx:04d}") # 4位数字序号 if extension: ext_part = extension # 组合新文件名 new_filename = "_".join(new_name) + ext_part new_path = os.path.join(directory, new_filename) # 防止覆盖已存在文件 if os.path.exists(new_path): print(f"警告: 跳过已存在的文件 {new_filename}") continue try: os.rename(old_path, new_path) counter += 1 except Exception as e: print(f"重命名失败: {filename} -> {new_filename} ({str(e)})") return { "total_files": len(files), "renamed": counter, "skipped": len(files) - counter } # 使用示例(含路径转义处理) if __name__ == "__main__": # 注意Windows路径需要使用原始字符串或双反斜杠 target_dir = r"D:\datasets\WiderPerson\images\train" # 原始字符串避免转义问题 result = batch_rename( directory=target_dir, prefix="pedestrian", start_num=1, extension=".jpg", backup=True ) print(f"\n操作完成: {result['renamed']}/{result['total_files']} 文件已重命名") ``` ### 关键改进说明: 1. **强化路径验证**:采用与YOLOv8数据集配置相同的路径检查逻辑,使用`os.path.exists`进行预验证[^1] 2. **安全防护机制**: - 自动创建备份目录(`backup_original`) - 4位数字序号确保文件名唯一性(`f"{idx:04d}"`) - 跳过隐藏文件(`not f.startswith('.')`) 3. **扩展名处理**: ```python if extension: ext_part = extension # 强制修改扩展名 ``` 支持统一修改文件扩展名(如将所有`.png`改为`.jpg`) 4. **跨平台兼容**: - 使用`os.path.join`处理路径拼接 - 支持Windows长路径(需启用注册表项`LongPathsEnabled`) ### 使用方式 1. 保存为`advanced_rename.py` 2. 命令行执行: ```bash python advanced_rename.py ``` 3. 交互模式示例: ```python # 修改训练集图片命名 batch_rename(r"F:\widerperson\images\train", prefix="train", extension=".jpg") # 修改验证集标签文件 batch_rename(r"F:\widerperson\labels\val", prefix="val", extension=".txt") ``` ### 常见问题解决 1. **权限不足错误**: - 以管理员身份运行CMD/PowerShell - 执行`icacls "D:\datasets" /grant Everyone:(OI)(CI)F`(Windows) 2. **特殊字符处理**: ```python # 处理包含空格的路径 batch_rename(r"C:\Program Files\My Data", ...) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值