Python實(shí)現(xiàn)文件批量重命名器
前言
在日常工作和學(xué)習(xí)中,我們經(jīng)常需要對大量文件進(jìn)行重命名操作。手動(dòng)一個(gè)個(gè)修改既耗時(shí)又容易出錯(cuò),特別是當(dāng)文件數(shù)量較多時(shí)。本文將介紹一個(gè)使用Python開發(fā)的文件批量重命名工具,它提供了多種重命名模式,可以大大提高文件管理效率。
功能特點(diǎn)
多種重命名模式:前綴添加、后綴添加、字符串替換、序列號命名
交互式操作界面:清晰的提示和引導(dǎo)
安全機(jī)制:操作前確認(rèn)、沖突檢測、錯(cuò)誤處理
靈活配置:可自定義序列號格式、起始值和分隔符
模塊化設(shè)計(jì)
本工具采用模塊化設(shè)計(jì),將不同功能拆分為獨(dú)立函數(shù),提高代碼可讀性和可維護(hù)性。下面我們來逐一了解各個(gè)模塊的實(shí)現(xiàn)。
1.目錄路徑獲取模塊
import os def get_directory(): """獲取用戶輸入的有效目錄路徑""" while True: dir_path = input("請輸入要處理的目錄路徑:").strip() if os.path.isdir(dir_path): return os.path.normpath(dir_path) print("× 目錄不存在,請重新輸入")
2.文件列表獲取模塊
import os def list_files(dir_path): """列出目錄中的所有文件并返回列表""" files = [f for f in sorted(os.listdir(dir_path)) if os.path.isfile(os.path.join(dir_path, f))] print("\n目錄文件列表:") for idx, f in enumerate(files, 1): print(f"{idx:02d}. {f}") return files
3.重命名模式選擇模塊
def get_rename_mode(): """獲取用戶選擇的命名模式""" print("\n請選擇重命名模式:") print("1. 添加前綴\t2. 添加后綴") print("3. 替換字符串\t4. 序列號") while True: mode = input("請輸入選項(xiàng) (1-4):").strip() if mode in {'1', '2', '3', '4'}: return mode print("× 無效輸入,請重新選擇")
4.序列號參數(shù)配置模塊
def get_sequence_params(): """獲取序列號模式參數(shù)""" print("\n序列號模式參數(shù)設(shè)置:") try: start = int(input("起始數(shù)字 (默認(rèn)1):") or 1) digits = int(input("位數(shù) (默認(rèn)3):") or 3) sep = input("分隔符 (默認(rèn)_):") or "_" return start, digits, sep except ValueError: print("! 輸入無效,使用默認(rèn)設(shè)置:起始=1,位數(shù)=3,分隔符=_") return 1, 3, "_"
完整代碼實(shí)現(xiàn)
下面是整合了所有模塊的完整代碼實(shí)現(xiàn):
import os def get_directory(): """獲取用戶輸入的有效目錄路徑""" while True: dir_path = input("請輸入要處理的目錄路徑:").strip() if os.path.isdir(dir_path): return os.path.normpath(dir_path) print("× 目錄不存在,請重新輸入") def list_files(dir_path): """列出目錄中的所有文件并返回列表""" files = [f for f in sorted(os.listdir(dir_path)) if os.path.isfile(os.path.join(dir_path, f))] print("\n目錄文件列表:") for idx, f in enumerate(files, 1): print(f"{idx:02d}. {f}") return files def get_rename_mode(): """獲取用戶選擇的命名模式""" print("\n請選擇重命名模式:") print("1. 添加前綴\t2. 添加后綴") print("3. 替換字符串\t4. 序列號") while True: mode = input("請輸入選項(xiàng) (1-4):").strip() if mode in {'1', '2', '3', '4'}: return mode print("× 無效輸入,請重新選擇") def get_sequence_params(): """獲取序列號模式參數(shù)""" print("\n序列號模式參數(shù)設(shè)置:") try: start = int(input("起始數(shù)字 (默認(rèn)1):") or 1) digits = int(input("位數(shù) (默認(rèn)3):") or 3) sep = input("分隔符 (默認(rèn)_):") or "_" return start, digits, sep except ValueError: print("! 輸入無效,使用默認(rèn)設(shè)置:起始=1,位數(shù)=3,分隔符=_") return 1, 3, "_" def main(): # 獲取目錄路徑 dir_path = get_directory() # 獲取文件列表 files = list_files(dir_path) if not files: print("! 該目錄沒有可操作文件") return # 確認(rèn)操作 if input("\n是否繼續(xù)操作?(y/n) ").lower() != 'y': print("操作已取消") return # 獲取重命名模式 mode = get_rename_mode() # 獲取模式參數(shù) params = {} if mode == '1': params['prefix'] = input("\n請輸入要添加的前綴:") elif mode == '2': params['suffix'] = input("\n請輸入要添加的后綴:") elif mode == '3': params['old'] = input("\n請輸入要替換的字符串:") params['new'] = input("請輸入替換后的新字符串:") elif mode == '4': params['start'], params['digits'], params['sep'] = get_sequence_params() # 二次確認(rèn) if input("\n!! 確認(rèn)執(zhí)行重命名操作?(y/n) ").lower() != 'y': print("操作已取消") return # 執(zhí)行重命名 counter = 0 current_num = params.get('start', 0) for filename in files: # 跳過隱藏文件(可選) if filename.startswith('.'): continue # 分割文件名和擴(kuò)展名 file_path = os.path.join(dir_path, filename) base, ext = os.path.splitext(filename) new_base = base # 根據(jù)模式生成新文件名 if mode == '1': new_base = f"{params['prefix']}{base}" elif mode == '2': new_base = f"{base}{params['suffix']}" elif mode == '3': new_base = base.replace(params['old'], params['new']) elif mode == '4': num_format = f"{current_num:0{params['digits']}}d" new_base = f"{num_format}{params['sep']}{base}" current_num += 1 new_name = f"{new_base}{ext}" new_path = os.path.join(dir_path, new_name) # 跳過未修改的情況 if new_name == filename: continue # 執(zhí)行重命名 try: if not os.path.exists(new_path): os.rename(file_path, new_path) print(f"√ {filename} → {new_name}") counter += 1 else: print(f"! 沖突:{new_name} 已存在") except Exception as e: print(f"× 錯(cuò)誤:重命名 {filename} 失敗 - {str(e)}") print(f"\n操作完成,成功重命名 {counter}/{len(files)} 個(gè)文件") if __name__ == "__main__": print("=== 文件批量重命名工具 ===") main()
代碼解析
核心設(shè)計(jì)思路
用戶體驗(yàn)優(yōu)先:
- 清晰的提示信息和錯(cuò)誤反饋
- 操作前確認(rèn)機(jī)制,防止誤操作
- 列表顯示處理文件,讓用戶了解操作對象
安全性考慮:
- 檢測目標(biāo)文件是否存在,避免覆蓋
- 異常捕獲處理,確保程序穩(wěn)定運(yùn)行
- 操作結(jié)果明確展示,方便用戶核對
功能模塊化:
- 每個(gè)功能獨(dú)立封裝為函數(shù)
- 清晰的函數(shù)命名和注釋
- 參數(shù)傳遞而非全局變量
技術(shù)要點(diǎn)
1.路徑處理:
- 使用os.path.isdir()驗(yàn)證目錄有效性
- 使用os.path.normpath()標(biāo)準(zhǔn)化路徑格式
- 使用os.path.join()構(gòu)建完整文件路徑
- 使用os.path.splitext()分離文件名和擴(kuò)展名
2.列表推導(dǎo)式:
- [f for f in sorted(os.listdir(dir_path)) if os.path.isfile(os.path.join(dir_path, f))]
- 一行代碼實(shí)現(xiàn)文件過濾和排序
3.字符串格式化:
- f-string實(shí)現(xiàn)動(dòng)態(tài)字符串拼接
- 使用{current_num:0{params['digits']}}d實(shí)現(xiàn)動(dòng)態(tài)寬度的數(shù)字格式化
4.輸入驗(yàn)證與默認(rèn)值:
- 使用input(...) or default_value提供默認(rèn)值
- 使用集合{'1', '2', '3', '4'}高效驗(yàn)證輸入選項(xiàng)
進(jìn)階改進(jìn)方向
圖形界面:添加GUI界面,提升用戶體驗(yàn)
正則表達(dá)式支持:增加正則表達(dá)式匹配和替換功能
預(yù)覽功能:在執(zhí)行前預(yù)覽重命名結(jié)果
撤銷功能:添加操作日志和撤銷功能
批處理模式:支持從配置文件讀取參數(shù),實(shí)現(xiàn)無人工干預(yù)的批處理
遞歸處理:支持遞歸處理子目錄中的文件
到此這篇關(guān)于Python實(shí)現(xiàn)文件批量重命名器的文章就介紹到這了,更多相關(guān)Python重命名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
jupyter notebook tensorflow打印device信息實(shí)例
這篇文章主要介紹了jupyter notebook tensorflow打印device信息實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04使用BeautifulSoup4解析XML的方法小結(jié)
這篇文章主要介紹了使用BeautifulSoup4解析XML的方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Python處理RSS、ATOM模塊FEEDPARSER介紹
這篇文章主要介紹了Python處理RSS、ATOM模塊FEEDPARSER介紹,本文只是做個(gè)入門級的簡潔介紹,需要的朋友可以參考下2015-02-02