容關(guān)鍵詞批量改名)
10智能重命名——基于文件修改日期或內(nèi)容關(guān)鍵詞批量改名第二階段文件管理與系統(tǒng)自動化9-15場景引入下載文件夾里是不是有這些文件名新建文檔 (3).docx 未命名 (1).xlsx DSC_0847.JPG 截圖 (2024-03-01 14-32-15).png 報告終稿_最終版_不改了_v2.pdf這些文件名毫無意義過幾天就不知道是什么內(nèi)容了。本節(jié)教你用 Python 批量重命名讓文件名變得清晰可讀。技術(shù)原理批量重命名的核心掃描文件 → 根據(jù)規(guī)則生成新文件名 → 重命名os.rename常用命名規(guī)則規(guī)則適用場景示例按日期重命名照片、截圖2024-03-01_會議紀要.docx加前綴/序號批量編號001_合同.pdf,002_發(fā)票.pdf提取關(guān)鍵詞合同/報告類華為-2024Q1合同.pdf統(tǒng)一格式規(guī)范化全小寫、替換空格為下劃線環(huán)境準備無需額外安裝使用 Python 內(nèi)置模塊。如需從 PDF/Word 中提取關(guān)鍵詞需安裝pipinstallPyPDF2 python-docx完整代碼importosfrompathlibimportPathfromdatetimeimportdatetime# 方案 1按日期重命名 defrename_by_date(target_dir,prefix,suffix,date_format%Y-%m-%d): 按文件修改日期重命名 參數(shù): 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_發(fā)票.pdf, 003_報告.pdf target_pathPath(target_dir)filessorted([fforfintarget_path.iterdir()iff.is_file()])# 計算序號位數(shù)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規(guī)范化文件名 defnormalize_filenames(target_dir): 規(guī)范化文件名 - 空格替換為下劃線 - 多個連續(xù)空格合并為一個 - 全小寫 - 移除特殊字符 importre target_pathPath(target_dir)count0forfile_pathintarget_path.iterdir():iffile_path.is_file():old_namefile_path.name stemfile_path.stem suffixfile_path.suffix# 規(guī)范化處理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)# 合并連續(xù)下劃線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規(guī)范化完成:{count}個文件)# 方案 4查找并替換文件名中的文本 deffind_replace_in_filenames(target_dir,find_text,replace_text): 批量查找替換文件名中的文本 參數(shù): 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規(guī)范化所有文件名# normalize_filenames(TARGET_DIR)# 方案 4批量刪除文件名中的 (1)find_replace_in_filenames(TARGET_DIR,(1),)代碼逐行解析1. 獲取文件修改時間mtimedatetime.fromtimestamp(file_path.stat().st_mtime)file_path.stat()獲取文件元數(shù)據(jù)大小、時間等.st_mtime是最后修改時間Unix 時間戳datetime.fromtimestamp()轉(zhuǎn)為可讀的日期對象2. 序號位數(shù)自動計算num_digitslen(str(len(files)start))num_strstr(idx).zfill(num_digits)10 個文件 → 2 位 →01~10100 個文件 → 3 位 →001~100.zfill()左側(cè)補零3. 正則表達式規(guī)范化re.sub(r\s,_,new_stem)# 一個或多個空格 → 一個下劃線re.sub(r[^\w\u4e00-\u9fff_-],,new_stem)# 保留字母、數(shù)字、中文、下劃線\w匹配字母、數(shù)字、下劃線\u4e00-\u9fff是中文字符的 Unicode 范圍^在[]內(nèi)表示取反進階技巧技巧 1從 PDF 內(nèi)容提取關(guān)鍵詞作為文件名importPyPDF2defrename_pdf_by_content(pdf_path,max_words5):從 PDF 前幾行提取關(guān)鍵詞作為文件名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,文件大小(字節(jié)):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)總結(jié)重命名規(guī)則函數(shù)效果示例按日期rename_by_date()2024-03-01_報告.pdf加序號rename_with_sequential_numbers()001_合同.pdf規(guī)范化normalize_filenames()huibao_zhonggao.pdf查找替換find_replace_in_filenames()刪除(1)等無用后綴本節(jié)掌握了 4 種常用的批量重命名策略讓文件名從混亂變?yōu)橐?guī)范可讀。下一節(jié)預告11備份專家——定時自動同步重要文件夾至移動硬盤或云端