Python + AI 自动批量重命名文件:一个最小可用脚本思路 | xkmchenmu Blog

Python + AI 自动批量重命名文件:一个最小可用脚本思路

用 Python 和 AI 思路整理文件名:先读取文件、提取规则、生成新名称、人工确认,再批量重命名。

文件夹里堆满“新建文档”“截图 2026”“最终版2”“资料副本”“未命名文件”时,查找资料会变得非常低效。尤其是学习资料、合同文件、图片素材、PDF文档、博客附件越来越多以后,文件名混乱会直接影响后续整理、检索和归档。

Python 可以负责扫描文件、生成预览表、检查冲突和执行重命名;AI 可以根据文件名、文件内容摘要或人为设定的规则,生成更清晰的新文件名。但真正执行重命名前,必须保留人工确认步骤,避免误改、覆盖或造成文件丢失。

这类工具的核心原则是:AI 负责建议、脚本负责整理、人工负责确认、日志负责兜底。

一、适合处理的场景

1. 学习资料整理

例如:

医学基础知识.pdf

截图20260601.png

未命名文档.docx

资料最终版2.pdf

这些文件名无法直接判断内容,可以通过统一命名规则改成:

2026-06-01_医学基础知识_复习资料_v1.pdf

2026-06-01_病理学知识点_截图_v1.png

2026-06-01_护理考试资料_文档_v1.docx

这样后续查找会更直观。

2. 博客素材整理

博客站点经常会积累大量图片、缩略图、文章附件、演示图、截图文件。

例如:

image1.png

微信截图_202606.png

未命名设计.png

文章配图最终版.png

可以整理成:

2026-06-01_AI文章缩略图_封面_v1.png

2026-06-01_WordPress页面截图_素材_v1.png

2026-06-01_医学备考文章配图_封面_v1.png

规范命名后,更适合上传到 WordPress 媒体库,也方便后期维护。

3. 合同、发票、报告整理

这类文件通常需要按时间、主体、类型进行归档。

例如:

2026-05-30_腾讯云_CDN费用发票_v1.pdf

2026-06-01_服务器采购_合同_v1.pdf

2026-06-02_AI平台使用情况_分析报告_v1.docx

命名清楚以后,文件本身就带有基本信息,不需要反复打开查看。

4. 批量下载文件整理

从网盘、邮箱、浏览器或系统导出的文件,常常带有乱码、随机编号或无意义名称。

例如:

download-12345.pdf

file_0001.docx

附件1.pdf

扫描件.pdf

这类文件适合先生成重命名预览表,再人工确认后统一处理。

二、不适合直接自动重命名的场景

并不是所有文件都适合直接交给 AI 自动命名。

以下场景应谨慎处理:1、系统目录中的文件;2、程序运行依赖的配置文件;3、数据库文件;4、项目源码中的关键文件;5、已有固定引用关系的网页素材;6、被其他软件、网页、数据库引用的文件;7、多人协作目录中的共享文件。

例如,WordPress 主题、插件、程序项目中的文件名,可能已经被代码引用。如果随意重命名,可能导致程序无法运行、图片无法显示、链接失效。

因此,自动重命名脚本最好只处理指定的普通资料文件夹,不要直接处理系统目录、网站根目录、程序源码目录。

三、推荐命名规则

一个比较通用的命名格式是:

YYYY-MM-DD_主题_类型_版本号.扩展名

例如:

2026-06-01_AI-Agent-入门_笔记_v1.md

2026-06-01_康复评定量表_资料_v1.pdf

2026-06-01_WordPress插件审查_报告_v1.docx

2026-06-01_致病因素知识点_缩略图_v1.png

这个格式有几个优点:

日期在最前面,方便排序。

主题放在中间,方便搜索。

类型用于区分笔记、报告、截图、发票、合同、素材等。

版本号用于区分修改次数。

扩展名保持不变,避免文件类型错误。

四、文件名规则建议

1. 尽量避免特殊符号

文件名中不建议使用以下符号:

/ \ : * ? ” < > |

这些符号在不同系统中可能有特殊含义,容易导致保存失败、路径错误或跨平台兼容问题。

2. 文件名不要过长

文件名过长会影响显示,也可能导致路径长度问题。

建议控制在 40 到 80 个字符以内。

例如:

不推荐:

2026-06-01_这是我今天整理出来的关于人工智能模型接口调用和自动化脚本使用方法的最终最终版本_v3.pdf

推荐:

2026-06-01_AI模型接口调用_脚本笔记_v3.pdf

3. 保留原扩展名

重命名时不要随意改变扩展名。

例如:

原文件是 .pdf,就继续保留 .pdf。

原文件是 .docx,就继续保留 .docx。

原文件是 .png,就继续保留 .png。

如果把 PDF 文件误改成 .txt,并不会真正改变文件格式,反而可能导致系统无法正确打开。

4. 不确定主题时使用“待分类”

如果 AI 无法判断文件主题,不要强行编造。

可以使用:

2026-06-01_待分类_资料_v1.pdf

2026-06-01_待分类_截图_v1.png

后续人工查看后再修改。

五、整体自动化流程

一个安全的自动批量重命名流程应该分为两步:

第一步:生成预览表。

第二步:人工确认后执行重命名。

具体流程如下:

  1. 指定需要整理的文件夹。
  2. 扫描文件夹中的文件。
  3. 读取文件名、扩展名、修改时间、文件大小。
  4. 可选读取文本内容摘要。
  5. 把文件信息发送给 AI。
  6. AI 根据命名规则生成候选新文件名。
  7. 脚本生成 preview.csv 预览表。
  8. 人工检查 old_name 和 new_name 是否合理。
  9. 人工把确认列改为 yes。
  10. 脚本只处理确认过的文件。
  11. 执行前检测重名冲突。
  12. 执行重命名。
  13. 保存 rename_log.csv 日志。
  14. 必要时根据日志回滚。

六、Prompt 模板

可以使用下面这个 Prompt,让 AI 根据文件信息生成候选文件名。

请根据下面的文件信息,生成更清晰的中文文件名。

命名规则:

YYYY-MM-DD_主题_类型_版本号.扩展名

要求:

  1. 保留原扩展名。
  2. 文件名不超过 60 个字符。
  3. 不使用特殊符号。
  4. 不确定主题时写“待分类”。
  5. 不要改变文件真实类型。
  6. 不要编造文件内容中没有的信息。
  7. 同一主题文件可以使用 v1、v2、v3 区分版本。
  8. 只输出 JSON 数组,不要输出解释。

输出格式:

[
{
“old_name”: “原文件名.pdf”,
“new_name”: “2026-06-01_主题_类型_v1.pdf”,
“reason”: “根据文件名和摘要判断主题”
}
]

文件信息:

【这里粘贴文件名、扩展名、修改时间、文件大小、内容摘要】

七、文件信息示例

发送给 AI 的文件信息可以这样整理:

[
{
“old_name”: “截图 2026-06-01 120033.png”,
“suffix”: “.png”,
“modified”: “2026-06-01”,
“size”: “356KB”,
“summary”: “图片内容疑似为 WordPress 后台插件设置页面”
},
{
“old_name”: “最终版2.pdf”,
“suffix”: “.pdf”,
“modified”: “2026-06-01”,
“size”: “1.2MB”,
“summary”: “PDF 前几段内容与医学基础知识、致病因素有关”
}
]

AI 可以返回:

[
{
“old_name”: “截图 2026-06-01 120033.png”,
“new_name”: “2026-06-01_WordPress插件设置_截图_v1.png”,
“reason”: “图片内容为 WordPress 后台插件设置页面”
},
{
“old_name”: “最终版2.pdf”,
“new_name”: “2026-06-01_致病因素知识点_资料_v1.pdf”,
“reason”: “内容与医学基础知识中的致病因素有关”
}
]

八、Python 最小脚本思路

下面是一个最小可用脚本思路。它不会直接调用 AI,而是先扫描文件夹,生成一个 preview.csv。你可以把 preview.csv 的内容交给 AI 生成新文件名,再人工填写回表格中。

from pathlib import Path
import csv
from datetime import datetime

folder = Path("./待整理")
preview_file = Path("preview.csv")

rows = []

for file in folder.iterdir():
    if file.is_file():
        stat = file.stat()
        modified = datetime.fromtimestamp(stat.st_mtime).strftime("%Y-%m-%d")
        size_kb = round(stat.st_size / 1024, 2)

        rows.append({
            "old_name": file.name,
            "new_name": "",
            "suffix": file.suffix,
            "modified": modified,
            "size_kb": size_kb,
            "confirm": "no"
        })

with preview_file.open("w", newline="", encoding="utf-8-sig") as f:
    writer = csv.DictWriter(
        f,
        fieldnames=["old_name", "new_name", "suffix", "modified", "size_kb", "confirm"]
    )
    writer.writeheader()
    writer.writerows(rows)

print("已生成 preview.csv,请人工填写 new_name,并将 confirm 改为 yes 后再执行重命名。")

这个脚本只做一件事:生成预览表。

这样比较安全,不会一运行就改动文件。

九、确认后执行重命名脚本

当 preview.csv 中的 new_name 填写完成,并且 confirm 改为 yes 后,再运行执行脚本。

from pathlib import Path
import csv
from datetime import datetime

folder = Path("./待整理")
preview_file = Path("preview.csv")
log_file = Path("rename_log.csv")

logs = []

def safe_name(name: str) -> str:
    invalid_chars = ['/', '\\', ':', '*', '?', '"', '<', '>', '|']
    for ch in invalid_chars:
        name = name.replace(ch, "_")
    return name.strip()

with preview_file.open("r", encoding="utf-8-sig") as f:
    reader = csv.DictReader(f)

    for row in reader:
        old_name = row["old_name"].strip()
        new_name = safe_name(row["new_name"].strip())
        confirm = row["confirm"].strip().lower()

        if confirm != "yes":
            continue

        if not old_name or not new_name:
            continue

        old_path = folder / old_name
        new_path = folder / new_name

        if not old_path.exists():
            logs.append({
                "time": datetime.now().isoformat(timespec="seconds"),
                "old_name": old_name,
                "new_name": new_name,
                "status": "failed",
                "message": "原文件不存在"
            })
            continue

        if old_path.suffix.lower() != new_path.suffix.lower():
            logs.append({
                "time": datetime.now().isoformat(timespec="seconds"),
                "old_name": old_name,
                "new_name": new_name,
                "status": "failed",
                "message": "扩展名不一致,已跳过"
            })
            continue

        if new_path.exists():
            logs.append({
                "time": datetime.now().isoformat(timespec="seconds"),
                "old_name": old_name,
                "new_name": new_name,
                "status": "failed",
                "message": "目标文件名已存在,已跳过"
            })
            continue

        old_path.rename(new_path)

        logs.append({
            "time": datetime.now().isoformat(timespec="seconds"),
            "old_name": old_name,
            "new_name": new_name,
            "status": "success",
            "message": "重命名成功"
        })

with log_file.open("w", newline="", encoding="utf-8-sig") as f:
    writer = csv.DictWriter(
        f,
        fieldnames=["time", "old_name", "new_name", "status", "message"]
    )
    writer.writeheader()
    writer.writerows(logs)

print("处理完成,已生成 rename_log.csv。")

这个脚本包含几个关键保护:

只处理 confirm 为 yes 的文件。

原文件不存在则跳过。

扩展名不一致则跳过。

目标文件名已存在则跳过。

每一次操作都写入日志。

十、回滚脚本思路

如果发现重命名后不合适,可以根据 rename_log.csv 回滚。

from pathlib import Path
import csv

folder = Path("./待整理")
log_file = Path("rename_log.csv")

with log_file.open("r", encoding="utf-8-sig") as f:
    reader = csv.DictReader(f)

    for row in reader:
        if row["status"] != "success":
            continue

        old_name = row["old_name"]
        new_name = row["new_name"]

        old_path = folder / old_name
        new_path = folder / new_name

        if new_path.exists() and not old_path.exists():
            new_path.rename(old_path)
            print(f"已回滚:{new_name} -> {old_name}")
        else:
            print(f"跳过:{new_name}")

回滚脚本并不是万能的。

如果文件已经被移动、删除、再次改名,回滚可能失败。因此,重要文件在批量处理前最好先备份一份。

十一、如何接入 AI

最简单的方式不是一开始就写 API,而是采用半自动流程:

  1. Python 扫描文件夹,生成 preview.csv。
  2. 把 preview.csv 中的文件信息复制给 AI。
  3. AI 生成候选 new_name。
  4. 人工把候选文件名填回 preview.csv。
  5. 人工检查后,把 confirm 改成 yes。
  6. Python 执行重命名。

这个流程虽然不是完全自动,但更安全,适合个人资料整理、博客素材整理和学习资料整理。

如果后续要完全自动化,可以再接入 AI API,让脚本自动读取文件信息并请求模型生成新文件名。

十二、完全自动化时需要注意什么

完全自动化看起来更省事,但风险也更高。

需要注意以下问题:

1. 不要让 AI 直接决定是否执行

AI 可以生成建议,但不应该直接拥有最终执行权。

建议保留预览表、确认字段和日志。

2. 不要读取敏感文件内容

合同、身份证、银行卡、账号密码、密钥、病历、隐私文件等,不建议直接发送给 AI。

可以只发送文件名、扩展名、修改时间和人工摘要。

3. 不要处理系统目录

脚本应该限制在指定文件夹内运行。

不要递归处理整个磁盘。

不要处理 C 盘系统目录。

不要处理服务器根目录。

不要处理网站程序目录。

4. 不要覆盖已有文件

重命名前必须检查目标文件是否已经存在。

如果存在,可以跳过,也可以自动加编号。

例如:

2026-06-01_AI素材_截图_v1.png

2026-06-01_AI素材_截图_v2.png

5. 不要改变扩展名

除非非常确定,否则不要让 AI 改扩展名。

文件类型应该由原始文件决定,而不是由模型猜测。

十三、冲突命名处理

当多个文件被 AI 命名为同一个名称时,需要自动加编号。

例如:

2026-06-01_WordPress页面截图_素材_v1.png

2026-06-01_WordPress页面截图_素材_v2.png

2026-06-01_WordPress页面截图_素材_v3.png

可以设计一个函数:

from pathlib import Path

def get_unique_path(path: Path) -> Path:
    if not path.exists():
        return path

    stem = path.stem
    suffix = path.suffix
    parent = path.parent

    index = 2
    while True:
        new_path = parent / f"{stem}_v{index}{suffix}"
        if not new_path.exists():
            return new_path
        index += 1

这样可以减少重名导致的失败。

但从安全角度来说,第一次做工具时更建议“发现冲突就跳过”,等确认流程稳定后再考虑自动编号。

十四、读取文件内容摘要的思路

如果只根据文件名判断,AI 可能无法准确生成新名称。

例如:

最终版.pdf

附件1.docx

扫描件.png

这类文件名信息太少,需要读取部分内容摘要。

可以采用以下策略:

1. 文本文件

对于 .txt、.md、.csv 等文本文件,可以读取前 500 到 1000 个字符。

2. Word 文档

对于 .docx 文件,可以使用专门库读取正文前几段。

3. PDF 文件

对于 PDF 文件,可以读取前几页文本。

如果 PDF 是扫描图片,则需要 OCR 才能识别文字。

4. 图片文件

对于图片文件,可以读取文件名、尺寸、创建时间,也可以由视觉模型生成图片描述。

但图片识别更容易出现误判,建议保留人工确认。

十五、目录整理扩展

重命名只是第一步,后续还可以让脚本按类型或主题自动归档。

例如:

待整理/

整理后/

整理后/学习资料/

整理后/博客素材/

整理后/合同发票/

整理后/截图图片/

整理后/待分类/

可以按文件类型归档:

图片:.png、.jpg、.jpeg、.webp

文档:.docx、.pdf、.txt、.md

表格:.xlsx、.csv

压缩包:.zip、.rar、.7z

也可以按主题归档:

AI技术

WordPress

医学备考

服务器运维

合同发票

闲置交易

十六、适合个人使用的文件名分类词

可以预先规定一些类型词,避免 AI 随意发挥。

常见类型词:

笔记

资料

报告

截图

封面

缩略图

合同

发票

文档

表格

源码

备份

日志

配置

素材

草稿

终稿

待分类

使用固定类型词的好处是文件名更统一,不会出现“材料”“资料”“文档”“文件”混用的情况。

十七、推荐的执行顺序

第一次使用时,不建议直接处理大量文件。

推荐流程:

  1. 新建一个测试文件夹。
  2. 复制 10 个无关紧要的文件进去。
  3. 运行扫描脚本,生成 preview.csv。
  4. 手动填写几个 new_name。
  5. 把 confirm 改成 yes。
  6. 运行重命名脚本。
  7. 检查结果是否符合预期。
  8. 测试回滚脚本。
  9. 确认稳定后,再处理真实资料。
  10. 处理重要文件前先备份。

十八、常见问题

1. 为什么不直接让 AI 自动改名?

因为文件名一旦改错,可能影响后续查找、引用和归档。

AI 可以判断主题,但不应该直接跳过人工确认。尤其是合同、发票、项目文件、博客素材等,误改后排查成本较高。

2. 为什么要生成 preview.csv?

preview.csv 是预览表,也是人工确认入口。

它能让用户清楚看到:

原文件名是什么。

新文件名是什么。

是否确认执行。

哪些文件被跳过。

这样比直接运行脚本更安全。

3. 为什么要保存 rename_log.csv?

rename_log.csv 是操作日志。

它能记录:

什么时候改名。

原文件名是什么。

新文件名是什么。

是否成功。

失败原因是什么。

后续如果需要回滚,也要依赖日志。

4. 为什么要保留扩展名?

扩展名代表文件类型。

如果把 .pdf 改成 .txt,并不会让 PDF 变成文本文件,只会导致系统识别混乱。

5. 为什么不建议处理网站目录?

网站目录中的图片、CSS、JS、PHP 文件可能被网页、数据库或程序代码引用。

随意重命名可能导致页面图片丢失、样式失效、程序报错。

十九、一个更稳妥的版本设计

一个比较完整的批量重命名工具,可以分成四个脚本:

scan.py:扫描文件夹,生成 preview.csv。

rename.py:根据 preview.csv 执行重命名。

rollback.py:根据 rename_log.csv 回滚。

config.json:保存命名规则、允许处理的扩展名、目标目录等配置。

这样结构更清晰,也方便后续维护。

目录示例:

rename_tool/

scan.py

rename.py

rollback.py

config.json

preview.csv

rename_log.csv

待整理/

二十、配置文件示例

config.json 可以这样设计:

{
  "target_folder": "./待整理",
  "allowed_suffixes": [".pdf", ".docx", ".txt", ".md", ".png", ".jpg", ".jpeg", ".webp"],
  "max_filename_length": 80,
  "keep_suffix": true,
  "default_type": "待分类",
  "dry_run": true
}

配置文件的好处是不用每次修改 Python 代码。

后续只需要改配置,就可以适配不同文件夹和不同处理规则。

二十一、命名示例对照

原文件名:新建文档.docx

建议文件名:2026-06-01_待分类_文档_v1.docx

原文件名:截图 2026-06-01 120033.png

建议文件名:2026-06-01_WordPress后台页面_截图_v1.png

原文件名:最终版2.pdf

建议文件名:2026-06-01_待分类_资料_v2.pdf

原文件名:IMG_20260601.jpg

建议文件名:2026-06-01_待分类_图片_v1.jpg

原文件名:合同扫描件.pdf

建议文件名:2026-06-01_待分类_合同_v1.pdf

原文件名:AI文章封面.png

建议文件名:2026-06-01_AI文章封面_缩略图_v1.png

二十二、总结

Python + AI 批量重命名文件,并不是简单地把文件名自动改掉,而是要建立一套安全、可预览、可确认、可回滚的整理流程。

比较稳妥的做法是:

先扫描文件。

再生成预览表。

让 AI 提供候选名称。

人工确认后再执行。

执行过程记录日志。

必要时可以回滚。

对于个人资料整理、学习资料归档、博客素材管理、合同发票分类、截图文件清理等场景,这种方法能够明显降低整理成本。

但需要注意,AI 适合做“命名建议”,不适合直接掌握“最终执行权”。真正安全的自动化,不是完全没有人工参与,而是把人工判断放在关键节点上,把重复劳动交给脚本完成。

(0)
打赏 支付宝扫一扫 支付宝扫一扫

发表回复

登录后才能评论