查看: 356|回复: 3

Python实现文件批量重命名与按扩展名自动归档

[复制链接]
发表于 昨天 11:00 | 显示全部楼层 |阅读模式
在日常开发或文件管理时,经常遇到大量文件需要统一命名或按类型归档的场景。Python 内置的 os 和 shutil 模块提供了文件操作接口,可以快速编写脚本完成批量处理。下面结合具体函数参数和逻辑,实现两个实用功能:批量重命名(支持统一前缀编号和关键词替换)以及智能文件分类。

## 批量重命名

### 1. 统一命名规则

以下函数将指定目录下的所有文件按修改时间排序后,统一重命名为“前缀_编号.扩展名”格式。
  1. import os
  2. def batch_rename(directory, prefix="file", start=1, digits=3):
  3.     """
  4.     统一命名:prefix_001.ext, prefix_002.ext ...
  5.     directory: 文件夹路径
  6.     prefix: 文件名前缀
  7.     start: 起始编号
  8.     digits: 编号位数(不足补零)
  9.     """
  10.     files = [f for f in os.listdir(directory)
  11.              if os.path.isfile(os.path.join(directory, f))]
  12.     # 按修改时间排序,保持顺序一致性
  13.     files.sort(key=lambda x: os.path.getmtime(
  14.         os.path.join(directory, x)))
  15.     for i, filename in enumerate(files):
  16.         name, ext = os.path.splitext(filename)
  17.         new_name = f"{prefix}_{str(start + i).zfill(digits)}{ext}"
  18.         old_path = os.path.join(directory, filename)
  19.         new_path = os.path.join(directory, new_name)
  20.         os.rename(old_path, new_path)
  21.         print(f"{filename} → {new_name}")
复制代码

参数说明:
- `directory`:目标文件夹路径,需要绝对路径或相对当前工作目录的相对路径。
- `prefix`:新文件名的前缀字符串,默认 "file"。
- `start`:起始序号,默认从 1 开始。
- `digits`:序号部分的位数,例如 digits=3 会生成 001、002 ...,不足位时自动补零。

调用示例:`batch_rename("/path/to/files", prefix="photo", start=1, digits=4)` 会将文件重命名为 photo_0001.jpg、photo_0002.jpg 等。

### 2. 替换文件名中的关键词

如果只是想批量替换文件名中的一段文字(例如将“草稿”改为“正式版”),可使用以下函数:
  1. def replace_text(directory, old_text, new_text):
  2.     """批量替换文件名中的关键词"""
  3.     count = 0
  4.     for f in os.listdir(directory):
  5.         fp = os.path.join(directory, f)
  6.         if os.path.isfile(fp) and old_text in f:
  7.             new_name = f.replace(old_text, new_text)
  8.             os.rename(fp, os.path.join(directory, new_name))
  9.             count += 1
  10.     print(f"共替换 {count} 个文件")
复制代码

该函数会遍历目录下所有普通文件(跳过子目录),检测文件名是否包含 `old_text`,若包含则将其替换为 `new_text`。注意替换操作会原地修改文件名,不会改变扩展名。

## 智能文件归档

智能文件分类的目标是将不同扩展名的文件移动到对应的分类目录中。首先定义一个扩展名到分类名称的映射字典:
  1. EXTENSION_MAP = {
  2.     ".jpg": "图片", ".jpeg": "图片", ".png": "图片", ".gif": "图片",
  3.     ".doc": "文档", ".docx": "文档", ".pdf": "文档", ".txt": "文档",
  4.     ".xls": "表格", ".xlsx": "表格",
  5.     ".zip": "压缩包", ".rar": "压缩包", ".7z": "压缩包",
  6.     ".mp4": "视频", ".avi": "视频",
  7.     ".mp3": "音乐", ".wav": "音乐",
  8.     ".py": "代码", ".java": "代码", ".js": "代码", ".html": "代码",
  9. }
复制代码

然后通过 `auto_sort` 函数完成实际移动操作:
  1. import shutil
  2. def auto_sort(directory):
  3.     """按文件类型自动归档到子文件夹"""
  4.     for f in os.listdir(directory):
  5.         fp = os.path.join(directory, f)
  6.         if not os.path.isfile(fp):
  7.             continue
  8.         _, ext = os.path.splitext(f)
  9.         folder = EXTENSION_MAP.get(ext.lower(), "其他")
  10.         target = os.path.join(directory, folder)
  11.         os.makedirs(target, exist_ok=True)
  12.         shutil.move(fp, os.path.join(target, f))
复制代码

关键点:
- 使用 `os.path.splitext` 获取扩展名,并转为小写以匹配字典。
- 若扩展名不在映射字典中,则归类到“其他”文件夹。
- `os.makedirs(target, exist_ok=True)` 确保目标文件夹存在,如果已存在不会报错。
- `shutil.move` 将文件移动到对应分类子目录,原文件被移除。

调用 `auto_sort("/path/to/messy_folder")` 后,文件夹中所有文件会按类型整理到图片、文档、表格、压缩包、视频、音乐、代码、其他等子目录中。

## 注意事项

- 重命名和移动操作不可逆,建议先在小范围内测试。
- 如果文件名包含特殊字符或路径包含空格,`os.rename` 和 `shutil.move` 均能正常处理(Windows 下需注意路径长度限制)。
- 统一重命名时按修改时间排序,适合将按时间顺序的文件编号,若需要按文件名排序可修改 `sort` 的 key。

以上两个脚本可以独立使用,也可以组合调用:先重命名再归档,或者归档后再对分类结果重命名。Python 的 os 和 shutil 模块足够完成大部分日常文件整理需求,修改映射字典即可适配更多文件类型。
回复

使用道具 举报

发表于 昨天 11:05 | 显示全部楼层

Re: Python实现文件批量重命名与按扩展名自动归档

楼主的教程非常实用,代码结构清晰,参数设计也很周到,特别是按修改时间排序保证了重命名的顺序可预期。我补充一个使用上的小提醒:如果在归档前先执行替换文件名中的关键词,再运行自动分类,可以避免分类后文件名包含旧关键词的问题;另外在 `auto_sort` 里,如果目标分类子文件夹已经存在同名文件,直接移动可能会覆盖,建议加个判断或改名为“原文件名_副本”之类的防冲突逻辑。感谢分享!
回复 支持 反对

使用道具 举报

发表于 昨天 11:05 | 显示全部楼层

Re: Python实现文件批量重命名与按扩展名自动归档

实用!代码写得很清晰,参数也设计得很灵活。那个按修改时间排序的逻辑很贴心,避免了乱序重命名。自动归档的扩展名映射也很全,直接拿来就能用。我之前都是手动整理下载文件夹,这下可以一键搞定了。谢谢分享!
回复 支持 反对

使用道具 举报

发表于 昨天 11:05 | 显示全部楼层

Re: Python实现文件批量重命名与按扩展名自动归档

感谢分享,代码很清晰实用。我自己也写过类似的脚本,有几个小细节想和你探讨一下: 1. **替换关键词函数**:直接在整个文件名(含扩展名)中查找替换,如果旧词恰好匹配到扩展名的一部分(比如把`.doc`中的`doc`替换成`docx`),可能会意外修改扩展名导致文件无法打开。我一般会先用`os.path.splitext`分离出文件名和扩展名,只对文件名部分进行替换,最后再拼接回去。 2. **自动归档的目录创建**:`os.mkdir`在目标文件夹已存在时会抛出`FileExistsError`,建议换成`os.makedirs(class_dir, exist_ok=True)`,这样更安全,也能处理多级目录的情况。 3. **关于子目录**:函数里用`os.path.isfile`过滤了,所以不会处理子文件夹里的文件。如果想递归处理,可能需要配合`os.walk`,但看你这个场景可能不需要。 另外注意到`auto_sort`函数最后一行被截断了,应该还有创建子目录和`shutil.move`的代码吧?整体逻辑非常好,收藏了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-15 04:07 , Processed in 0.027969 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部