告别手动改名:用Python从零打造一个支持正则的批量文件重命名神器

部署运行你感兴趣的模型镜像

摘要

本文旨在提供一个完整的Python实战教程,指导开发者如何从零开始构建一个强大且可定制的命令行批量文件重命名工具。我们将摒弃对特定GUI软件的依赖,通过编写Python脚本来实现包括添加前后缀、序列化命名、简单替换乃至复杂的正则表达式匹配替换在内的多种重命名策略。文章将深入讲解os、re及argparse等标准库的应用,并最终提供一个功能完整、可直接在终端中使用的实用工具脚本。

正文

引言:为什么我们需要一个脚本化的重命名工具?

在日常开发、数据整理或文件归档工作中,批量重命名是一项高频任务。虽然市面上有许多优秀的GUI工具,但对于开发者而言,一个脚本化的解决方案往往意味着更高的效率、更强的灵活性和完全的可定制性。你可以将其无缝集成到其他自动化流程中,或者根据特定需求快速扩展其功能。本文将带你利用Python,打造一个属于你自己的、功能强大的批量重命名工具。

一、基础准备:Python的文件系统操作

在开始之前,我们需要掌握Python中用于文件操作的基础模块——os。

  • os.listdir(path): 列出指定目录下的所有文件和文件夹名。

  • os.path.join(path, name): 智能地拼接路径,会根据操作系统自动选择\或/。

  • os.rename(src, dst): 重命名文件或文件夹。

  • os.path.splitext(filename): 分离文件名和扩展名。

一个最简单的重命名操作如下:

import os

target_dir = './my_files'
old_name = os.path.join(target_dir, 'old_file.txt')
new_name = os.path.join(target_dir, 'new_file.txt')

try:
    os.rename(old_name, new_name)
    print(f'成功将 "{old_name}" 重命名为 "{new_name}"')
except FileNotFoundError:
    print(f'错误:文件 "{old_name}" 未找到。')
二、实现多种常用重命名模式

现在,我们来逐步实现几种常见的批量重命名逻辑。

def add_prefix_suffix(directory, prefix="", suffix=""):
    for filename in os.listdir(directory):
        if prefix or suffix:
            name, ext = os.path.splitext(filename)
            new_name = f"{prefix}{name}{suffix}{ext}"
            
            old_path = os.path.join(directory, filename)
            new_path = os.path.join(directory, new_name)
            
            os.rename(old_path, new_path)
            print(f'{filename} -> {new_name}')

给文件添加数字序号,例如 image_001.jpg, image_002.jpg

def sequential_naming(directory, pattern="file_{num}"):
    count = 1
    for filename in sorted(os.listdir(directory)): # sorted保证顺序
        _, ext = os.path.splitext(filename)
        # zfill(3) 用于补零,例如 1 -> 001
        formatted_num = str(count).zfill(3) 
        new_name = f"{pattern.format(num=formatted_num)}{ext}"
        
        os.rename(os.path.join(directory, filename), os.path.join(directory, new_name))
        print(f'{filename} -> {new_name}')
        count += 1

将文件名中的特定字符串替换为新的字符串。

def simple_replace(directory, old_str, new_str):
    for filename in os.listdir(directory):
        if old_str in filename:
            new_name = filename.replace(old_str, new_str)
            os.rename(os.path.join(directory, filename), os.path.join(directory, new_name))
            print(f'{filename} -> {new_name}')
三、核心进阶:利用正则表达式实现复杂重命名

正则表达式是处理复杂、非标准文件名格式的终极武器。Python的re模块是我们的好帮手,特别是re.sub()函数。

场景1:删除文件名中所有方括号及其内容,如 [Source]file.txt -> file.txt

import re

# ... 在循环中 ...
# r'\[.*?\]' 匹配从'['开始到']'结束的最短字符串
new_name = re.sub(r'\[.*?\]', '', filename).strip()
# ... rename ...

场景2:交换文件名中的部分内容,如 Artist - Title.mp3 -> Title - Artist.mp3

import re

# ... 在循环中 ...
# (.+?) 匹配并捕获 (懒惰模式) 任意字符
# \.mp3 匹配 .mp3 扩展名
pattern = r'(.+?) - (.+?)\.mp3'
# \2 代表第二个捕获组 (Title), \1 代表第一个 (Artist)
replacement = r'\2 - \1.mp3'
new_name = re.sub(pattern, replacement, filename)
# ... rename ...
四、整合:打造一个完整的命令行工具

为了让脚本更易用,我们使用argparse模块来解析命令行参数。

# renamer_script.py
import os
import re
import argparse

def batch_rename(args):
    directory = args.dir
    dry_run = args.dry_run

    for filename in sorted(os.listdir(directory)):
        old_path = os.path.join(directory, filename)
        if not os.path.isfile(old_path):
            continue

        name, ext = os.path.splitext(filename)
        new_name = ""

        if args.mode == 'replace':
            if args.pattern in name:
                new_name = name.replace(args.pattern, args.replacement) + ext
        
        elif args.mode == 'regex':
            try:
                new_name = re.sub(args.pattern, args.replacement, name) + ext
            except re.error as e:
                print(f"正则表达式错误: {e}")
                return
        
        # ... 可以添加更多模式 (prefix, suffix, sequential) ...

        if new_name and new_name != filename:
            new_path = os.path.join(directory, new_name)
            print(f'"{filename}" -> "{new_name}"')
            
            if not dry_run:
                try:
                    os.rename(old_path, new_path)
                except Exception as e:
                    print(f"  重命名失败: {e}")

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="Python 批量文件重命名工具")
    parser.add_argument('dir', type=str, help='目标文件夹路径')
    parser.add_argument('mode', type=str, choices=['replace', 'regex'], help='重命名模式')
    parser.add_argument('pattern', type=str, help='要查找的模式或字符串')
    parser.add_argument('replacement', type=str, help='用于替换的字符串')
    parser.add_argument('--dry-run', action='store_true', help='仅预览,不执行实际重命名')

    args = parser.parse_args()
    batch_rename(args)

使用方法:

# 简单替换 (预览)
python renamer_script.py ./my_photos replace "IMG_" "Photo_" --dry-run

# 正则表达式替换 (实际执行)
# 将 "2023-12-25_event.log" 改为 "event_2023-12-25.log"
python renamer_script.py ./logs regex "(\d{4}-\d{2}-\d{2})_(.+)" "\2_\1"
五、实践中的“避坑”指南
  1. 先预览,再执行 (--dry-run):在执行任何破坏性操作前,务必先进行预览。这是我们脚本中--dry-run参数的价值所在,能有效防止误操作。

  2. 处理文件名冲突:如果重命名后可能出现同名文件,os.rename()会报错(在Windows上)或覆盖(在某些Unix系统上)。在执行重命名之前,应检查新文件名是否已存在 (os.path.exists())。

  3. 备份是最后的保险:对于极其重要的数据,在执行批量操作前,最好的习惯是先进行备份。

  4. 正则表达式的贪婪与非贪婪:注意 * 和 + 的贪婪性,在很多情况下,使用非贪婪的 *? 和 +? 会更安全、更精确。

六、总结

通过本文的引导,我们不仅了解了批量文件重命名的多种策略,更重要的是,我们亲手打造了一个功能强大、完全可控的命令行工具。这个Python脚本远比任何GUI工具都更具扩展性,你可以根据自己的需求,轻松地为其增加新功能,例如读取图片EXIF信息进行重命名、集成到更大的自动化任务流中等。这正是脚本化和编程思维的魅力所在。

欢迎在评论区分享你的重命名脚本、更强大的正则表达式模式,或者你在自动化文件管理中遇到的有趣挑战!
文件批量改名神器zRenamer:免费绿色,正则替换,效率倍增!(Win版)整合安装包

评论区自取!
 

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值