
10智能重命名——基于文件修改日期或内容关键词批量改名第二阶段文件管理与系统自动化9-15场景引入下载文件夹里是不是有这些文件名新建文档 (3).docx 未命名 (1).xlsx DSC_0847.JPG 截图 (2024-03-01 14-32-15).png 报告终稿_最终版_不改了_v2.pdf这些文件名毫无意义过几天就不知道是什么内容了。本节教你用 Python 批量重命名让文件名变得清晰可读。技术原理批量重命名的核心扫描文件 → 根据规则生成新文件名 → 重命名os.rename常用命名规则规则适用场景示例按日期重命名照片、截图2024-03-01_会议纪要.docx加前缀/序号批量编号001_合同.pdf,002_发票.pdf提取关键词合同/报告类华为-2024Q1合同.pdf统一格式规范化全小写、替换空格为下划线环境准备无需额外安装使用 Python 内置模块。如需从 PDF/Word 中提取关键词需安装pipinstallPyPDF2 python-docx完整代码importosfrompathlibimportPathfromdatetimeimportdatetime# 方案 1按日期重命名 defrename_by_date(target_dir,prefix,suffix,date_format%Y-%m-%d): 按文件修改日期重命名 参数: target_dir: 目标目录 prefix: 文件名前缀 suffix: 文件名后缀 date_format: 日期格式 target_pathPath(target_dir)count0forfile_pathintarget_path.iterdir():iffile_path.is_file():# 获取修改时间mtimedatetime.fromtimestamp(file_path.stat().st_mtime)date_strmtime.strftime(date_format)# 生成新文件名new_namef{prefix}{date_str}{suffix}{file_path.suffix}new_pathtarget_path/new_name# 避免重复命名ifnew_path!file_pathandnotnew_path.exists():file_path.rename(new_path)print(f{file_path.name}→{new_name})count1print(f\n重命名完成:{count}个文件)# 方案 2批量加序号前缀 defrename_with_sequential_numbers(target_dir,prefix,start1): 按文件排序后加序号 示例: 001_合同.pdf, 002_发票.pdf, 003_报告.pdf target_pathPath(target_dir)filessorted([fforfintarget_path.iterdir()iff.is_file()])# 计算序号位数10 个文件用 2 位100 个用 3 位num_digitslen(str(len(files)start))foridx,file_pathinenumerate(files,start):num_strstr(idx).zfill(num_digits)new_namef{prefix}{num_str}_{file_path.name}new_pathtarget_path/new_nameifnotnew_path.exists():file_path.rename(new_path)print(f{file_path.name}→{new_name})print(f\n序号重命名完成:{len(files)}个文件)# 方案 3规范化文件名 defnormalize_filenames(target_dir): 规范化文件名 - 空格替换为下划线 - 多个连续空格合并为一个 - 全小写 - 移除特殊字符 importre target_pathPath(target_dir)count0forfile_pathintarget_path.iterdir():iffile_path.is_file():old_namefile_path.name stemfile_path.stem suffixfile_path.suffix# 规范化处理new_stemstem.lower()# 全小写new_stemre.sub(r\s,_,new_stem)# 空格→下划线new_stemre.sub(r[^\w\u4e00-\u9fff_-],,new_stem)# 移除特殊字符保留中文new_stemre.sub(r_,_,new_stem)# 合并连续下划线new_stemnew_stem.strip(_)# 去除首尾下划线new_namenew_stemsuffixifnew_name!old_name:new_pathtarget_path/new_nameifnotnew_path.exists():file_path.rename(new_path)print(f{old_name}→{new_name})count1else:print(f[跳过]{new_name}已存在)print(f\n规范化完成:{count}个文件)# 方案 4查找并替换文件名中的文本 deffind_replace_in_filenames(target_dir,find_text,replace_text): 批量查找替换文件名中的文本 参数: target_dir: 目标目录 find_text: 要查找的文本 replace_text: 替换为默认删除 target_pathPath(target_dir)count0forfile_pathintarget_path.iterdir():iffile_path.is_file():iffind_textinfile_path.name:new_namefile_path.name.replace(find_text,replace_text)new_pathtarget_path/new_nameifnotnew_path.exists():file_path.rename(new_path)print(f{file_path.name}→{new_name})count1print(f\n查找替换完成:{count}个文件)# 使用示例 if__name____main__:TARGET_DIRrD:\Downloads# 方案 1按日期重命名照片# rename_by_date(rD:\照片, prefix照片_, date_format%Y%m%d)# 效果: 照片_20240301.jpg# 方案 2批量加序号# rename_with_sequential_numbers(rD:\合同, prefix合同_)# 效果: 合同_001_原文件名.pdf# 方案 3规范化所有文件名# normalize_filenames(TARGET_DIR)# 方案 4批量删除文件名中的 (1)find_replace_in_filenames(TARGET_DIR,(1),)代码逐行解析1. 获取文件修改时间mtimedatetime.fromtimestamp(file_path.stat().st_mtime)file_path.stat()获取文件元数据大小、时间等.st_mtime是最后修改时间Unix 时间戳datetime.fromtimestamp()转为可读的日期对象2. 序号位数自动计算num_digitslen(str(len(files)start))num_strstr(idx).zfill(num_digits)10 个文件 → 2 位 →01~10100 个文件 → 3 位 →001~100.zfill()左侧补零3. 正则表达式规范化re.sub(r\s,_,new_stem)# 一个或多个空格 → 一个下划线re.sub(r[^\w\u4e00-\u9fff_-],,new_stem)# 保留字母、数字、中文、下划线\w匹配字母、数字、下划线\u4e00-\u9fff是中文字符的 Unicode 范围^在[]内表示取反进阶技巧技巧 1从 PDF 内容提取关键词作为文件名importPyPDF2defrename_pdf_by_content(pdf_path,max_words5):从 PDF 前几行提取关键词作为文件名withopen(pdf_path,rb)asf:readerPyPDF2.PdfReader(f)# 读取第一页的前 500 个字符textreader.pages[0].extract_text()[:500]# 提取前几个有意义的词wordstext.split()[:max_words]keywords_.join(words)returnf{keywords}.pdf技巧 2从 Word 文档标题提取文件名fromdocximportDocumentdefrename_docx_by_title(docx_path):docDocument(docx_path)# 假设第一个段落是标题titledoc.paragraphs[0].text[:50]returnf{title}.docx技巧 3生成重命名预览报告defgenerate_rename_preview(target_dir):生成 Excel 格式的改名预览importpandasaspd records[]forfinPath(target_dir).iterdir():iff.is_file():records.append({原文件名:f.name,文件大小(字节):f.stat().st_size,修改时间:datetime.fromtimestamp(f.stat().st_mtime),后缀:f.suffix})dfpd.DataFrame(records)df.to_excel(重命名预览报告.xlsx,indexFalse)print(预览报告已生成: 重命名预览报告.xlsx)常见问题Q1重命名后文件找不到了文件名确实改了只是你可能不记得新名字。建议在重命名前先做预览。Q2两个文件生成了相同的新文件名代码中通过if not new_path.exists()做了保护冲突的文件不会被重命名。如需更智能的处理如自动加序号可在冲突时添加后缀。Q3可以撤销重命名吗Python 的rename()操作无法直接撤销。建议# 方法 1重命名前先备份importshutil shutil.copytree(target_dir,target_dir_backup)# 方法 2生成改名日志withopen(rename_log.txt,w)asf:f.write(f{old_name}→{new_name}\n)总结重命名规则函数效果示例按日期rename_by_date()2024-03-01_报告.pdf加序号rename_with_sequential_numbers()001_合同.pdf规范化normalize_filenames()huibao_zhonggao.pdf查找替换find_replace_in_filenames()删除(1)等无用后缀本节掌握了 4 种常用的批量重命名策略让文件名从混乱变为规范可读。下一节预告11备份专家——定时自动同步重要文件夹至移动硬盘或云端