我的知识记录

Python 批量给文件名加前缀后缀:分类标记一步到位

用 Python 批量给文件夹里所有文件统一加前缀或后缀,如「2024Q3_报表.xlsx」「报告_最终版.pdf」,支持只加一次、避免重复添加,附预览。

场景痛点

一个项目的资料散在各个文件夹,想统一打个标记方便检索:报表类加 2024Q3_ 前缀,定稿的文档加 _定稿 后缀。手动一个一个改慢,改重了还不知道。用 Python 批量在文件名前面或后面统一加字,还能判断已经加过的不重复加,避免跑两遍变成 2024Q3_2024Q3_报表.xlsx

用到的库

纯标准库,无需 pip 安装:

# os、os.path 为标准库

完整代码

import os

# ========== 配置区 ==========
TARGET_DIR = "./报表"        # 目标文件夹
PREFIX = "2024Q3_"          # 前缀,不需要就留空 ""
SUFFIX = ""                  # 后缀,不需要就留空 ""
DRY_RUN = True               # True=预览,False=真正执行
# ============================


def main():
if not os.path.isdir(TARGET_DIR):
print(f"目录不存在:{TARGET_DIR}")
return

count = 0
for name in os.listdir(TARGET_DIR):
old_path = os.path.join(TARGET_DIR, name)
if not os.path.isfile(old_path):
continue

stem, ext = os.path.splitext(name)

# 已经带过前缀就跳过,避免重复添加
if PREFIX and stem.startswith(PREFIX):
continue
# 已经带过后缀就跳过
if SUFFIX and stem.endswith(SUFFIX):
continue

new_stem = f"{PREFIX}{stem}{SUFFIX}"
new_name = new_stem + ext

new_path = os.path.join(TARGET_DIR, new_name)
if os.path.exists(new_path):
print(f"[跳过] 目标已存在:{new_name}")
continue

print(f"[{'预览' if DRY_RUN else '执行'}] {name}  ->  {new_name}")
if not DRY_RUN:
os.rename(old_path, new_path)
count += 1

print(f"\n共 {count} 个文件(DRY_RUN={DRY_RUN})")


if __name__ == "__main__":
main()

代码讲解

  • 前缀加在主名前,后缀加在主名后、扩展名前f"{PREFIX}{stem}{SUFFIX}{ext}"。后缀加在扩展名前面,这样 报告.pdf 变成 报告_定稿.pdf,而不是 报告.pdf_定稿
  • 重复添加保护startswithendswith 判断这个标记是不是已经在文件名里了。已经有就跳过,脚本可以安全地反复运行,不会叠加。
  • PREFIX/SUFFIX 留空即不启用:两个开关独立,只想加前缀就把 SUFFIX 设成 "",反之亦然。
  • 扩展名不动:splitext 拆开后只重组主名,扩展名原样保留。

运行结果

终端逐条打印 月度报表.xlsx -> 2024Q3_月度报表.xlsx。预览确认没有重复添加、没有撞名,把 DRY_RUN 改成 False 正式跑一遍即可。

注意事项

  • 标记别和已有名字冲突:前缀里的下划线、位置先想清楚,别加完一串乱字符。
  • 脚本可重复运行是优点:因为有 startswith/endswith 判断,重复跑不会叠加,但还是建议正式跑前预览。
  • 隐藏文件会被一起改:比如 .DS_Store.gitkeep,不想要就加过滤,跳过以 . 开头的名字。
  • 文件夹不参与:本脚本只处理文件,目录名不动。要处理目录名把 isfile 改成 isdir
  • 先备份重要文件夹:哪怕有保护措施,正式批量改名前仍建议留底。

Python 批量给文件名加前缀后缀:分类标记一步到位

标签:

更新时间:2026-09-14 21:31:30

上一篇:Python 批量按修改日期归档文件:按月分文件夹整理

下一篇:Python文件备份到另一目录教程:shutil一键同步