在Python中批量重命名文件,本质上就是通过程序获取目标目录下的文件列表,按照预设的规则生成新文件名,再调用文件系统接口完成名称修改。与手动逐个修改相比,脚本化的方式不仅效率更高,还能在处理大量文件时保持命名规则的一致性。Python标准库中的os模块和shutil模块提供了文件重命名、移动以及目录遍历等能力,可以覆盖绝大多数批量重命名场景。无论是修改文件后缀、添加统一前缀、按序号整理图片,还是递归处理多层子目录中的文件,都可以通过较短的代码实现。

使用os模块完成基础批量重命名
os模块是Python中用于操作系统交互的核心模块,其中os.rename()函数可以直接修改单个文件或目录的名称。批量重命名时,需要先使用os.listdir()获取指定目录下的所有条目,然后通过os.path.isfile()过滤出普通文件,再结合os.path.join()拼接出完整的旧路径和新路径。这样设计可以保证脚本不会误操作子目录,并且能够在任意操作系统上正确拼接路径分隔符。
如果只是希望修改某一类文件的后缀名,可以先根据文件扩展名筛选目标文件,再利用字符串替换生成新文件名。下面的示例将指定目录下所有txt文件的后缀统一修改为md,同时保留文件名主体不变。
import os
target_dir = "./test_files"
for filename in os.listdir(target_dir):
old_path = os.path.join(target_dir, filename)
if os.path.isfile(old_path) and filename.endswith(".txt"):
new_filename = filename.replace(".txt", ".md")
new_path = os.path.join(target_dir, new_filename)
os.rename(old_path, new_path)
print(f"已将 {filename} 重命名为 {new_filename}")
除了修改后缀之外,批量为文件添加前缀也是一种常见需求。例如在整理项目资料、归档素材或统一导出文件时,给所有文件加上固定前缀可以方便后续识别和排序。此时只需要在原有文件名的前面拼接字符串即可,不需要修改后缀,也不需要关心文件类型。下面示例为目录下的所有普通文件添加“new_”前缀。
import os
target_dir = "./test_files"
prefix = "new_"
for filename in os.listdir(target_dir):
old_path = os.path.join(target_dir, filename)
if os.path.isfile(old_path):
new_filename = prefix + filename
new_path = os.path.join(target_dir, new_filename)
os.rename(old_path, new_path)
print(f"已将 {filename} 重命名为 {new_filename}")
结合shutil模块与序号规则实现灵活重命名
当重命名操作不仅需要修改文件名,还要将文件移动到其他目录时,shutil.move()函数是更合适的选择。与os.rename()相比,shutil.move()可以在不同目录之间移动文件,同时完成目标名称的修改。为了保证目标目录存在,可以在移动前使用os.makedirs()并设置exist_ok=True,这样即使目录已经存在也不会抛出异常。下面示例将源目录中的文件移动并重命名到新目录,新旧文件名可以通过前缀加以区分。
import os
import shutil
source_dir = "./old_files"
target_dir = "./new_files"
os.makedirs(target_dir, exist_ok=True)
for filename in os.listdir(source_dir):
old_path = os.path.join(source_dir, filename)
if os.path.isfile(old_path):
new_filename = "archive_" + filename
new_path = os.path.join(target_dir, new_filename)
shutil.move(old_path, new_path)
print(f"已将 {filename} 移动到 {target_dir} 并重命名为 {new_filename}")
在实际工作中,按照序号批量重命名文件的需求非常普遍,尤其是处理图片、截图、扫描件或连续帧文件时,往往希望将名称整理成便于排序和阅读的格式。实现时可以先使用列表推导式筛选出指定扩展名的文件,再通过sort()方法对文件名进行排序,确保处理顺序符合预期。随后使用enumerate()获取从1开始的序号,并利用格式化字符串生成带有固定位数的序号名称。
import os
target_dir = "./images"
image_files = [f for f in os.listdir(target_dir) if f.endswith((".jpg", ".png", ".jpeg"))]
image_files.sort()
for index, filename in enumerate(image_files, start=1):
old_path = os.path.join(target_dir, filename)
new_filename = f"img_{index:03d}{os.path.splitext(filename)[1]}"
new_path = os.path.join(target_dir, new_filename)
os.rename(old_path, new_path)
print(f"已将 {filename} 重命名为 {new_filename}")
上述代码中的os.path.splitext()函数可以拆出文件扩展名,从而在保留原扩展名的同时重新生成文件名主体。使用index:03d格式化序号,可以保证序号不足三位时自动补零,例如1、2、3会被格式化为001、002、003,这样在文件管理器中排序更加整齐。
操作注意事项与递归处理子目录
批量重命名操作会直接修改文件系统中的内容,因此在执行脚本之前需要格外注意以下几点,以免造成不可恢复的损失。首先,建议在处理前对原文件进行备份,尤其是针对重要资料或没有版本控制的文件。其次,应当使用os.path.exists()判断新文件名是否已经存在,如果目标路径已经有同名文件,直接调用重命名函数可能会覆盖原文件。此外,如果文件名中包含中文,需要确保Python脚本以UTF-8编码保存和运行,避免出现乱码问题。最后,当需要处理子目录中的文件时,普通的os.listdir()只能获取当前目录内容,无法自动进入下一级目录,此时应当使用os.walk()进行递归遍历。
- 重命名前建议先备份原文件,避免误操作导致文件丢失
- 使用
os.path.exists()判断新文件名是否已存在,防止覆盖已有文件 - 如果文件名包含中文,需要确保Python脚本的编码格式为UTF-8,避免乱码问题
- 遍历文件时如果需要处理子目录下的文件,可以使用
os.walk()函数递归获取所有文件路径
os.walk()会按照目录树自上而下地返回每一个目录的路径、子目录列表和文件列表。通过遍历返回的files列表,可以对每个文件执行重命名操作,同时保留文件原本所在的目录结构。下面的示例递归遍历项目日志目录,将所有log文件的后缀修改为txt,适合在日志归档或格式转换场景中使用。
import os
root_dir = "./project_logs"
for root, dirs, files in os.walk(root_dir):
for filename in files:
if filename.endswith(".log"):
old_path = os.path.join(root, filename)
new_filename = filename.replace(".log", ".txt")
new_path = os.path.join(root, new_filename)
os.rename(old_path, new_path)
print(f"已将 {old_path} 重命名为 {new_path}")
总的来说,使用Python批量重命名文件并不复杂,关键在于选择合适的方法获取文件列表,并在生成新文件名时注意保持规则一致。对于简单场景,os.rename()配合os.listdir()已经足够;对于需要跨目录操作的情况,可以改用shutil.move();而对于包含子目录的任务,则应当使用os.walk()递归处理。掌握这些基础模块的组合方式后,就可以根据实际需求灵活扩展脚本,例如加入正则表达式匹配、按文件大小或修改时间筛选、将重命名记录写入日志等功能,使批量文件管理更加安全、高效和可维护。