Python文件管理之批量重命名文件詳解
簡介
在日常工作中,我們經(jīng)常需要對大量文件進行重命名操作,特別是在整理照片、文檔或其他媒體文件時。手動一個個重命名不僅耗時,還容易出錯。本文將介紹一個實用的Python腳本——文件批量重命名工具,它可以大大提高我們的工作效率。
功能介紹
這個文件批量重命名工具具有以下核心功能:
- 批量重命名:可以同時對多個文件按照指定規(guī)則進行重命名
- 多種命名模式:支持序號命名、前綴命名、后綴命名等多種模式
- 文件過濾:可以根據(jù)文件擴展名、文件名特征等條件篩選文件
- 預(yù)覽功能:在實際執(zhí)行前可以預(yù)覽重命名結(jié)果
- 撤銷功能:支持操作撤銷,防止誤操作
- 日志記錄:記錄所有操作歷史,便于追蹤和審計
應(yīng)用場景
這個工具適用于以下場景:
- 照片整理:將相機拍攝的照片按日期或序號統(tǒng)一命名
- 文檔管理:對公司或個人文檔進行規(guī)范化命名
- 下載文件整理:對下載的文件進行批量重命名以提高可讀性
- 開發(fā)項目:對代碼文件或資源文件進行統(tǒng)一命名規(guī)范
- 學(xué)術(shù)研究:對實驗數(shù)據(jù)文件進行有序命名
報錯處理
腳本包含了完善的錯誤處理機制:
- 路徑不存在:檢查指定目錄是否存在,若不存在則提示用戶
- 權(quán)限不足:檢測文件操作權(quán)限,權(quán)限不足時給出明確提示
- 文件沖突:檢測目標文件名是否已存在,避免覆蓋重要文件
- 參數(shù)驗證:驗證用戶輸入的參數(shù)是否合法
- 異常捕獲:捕獲并處理運行過程中可能出現(xiàn)的各種異常
代碼實現(xiàn)
import os
import sys
import argparse
from datetime import datetime
class FileBatchRenamer:
def __init__(self, directory):
self.directory = directory
self.rename_log = []
def check_directory(self):
"""檢查目錄是否存在"""
if not os.path.exists(self.directory):
raise FileNotFoundError(f"目錄 '{self.directory}' 不存在")
if not os.path.isdir(self.directory):
raise NotADirectoryError(f"'{self.directory}' 不是一個有效的目錄")
def get_files(self, extension=None, pattern=None):
"""獲取符合條件的文件列表"""
try:
self.check_directory()
files = os.listdir(self.directory)
filtered_files = []
for file in files:
file_path = os.path.join(self.directory, file)
# 只處理文件,不處理子目錄
if os.path.isfile(file_path):
# 根據(jù)擴展名過濾
if extension and not file.endswith(extension):
continue
# 根據(jù)模式過濾
if pattern and pattern not in file:
continue
filtered_files.append(file)
return sorted(filtered_files)
except Exception as e:
print(f"獲取文件列表時出錯: {e}")
return []
def preview_rename(self, files, naming_pattern, start_number=1):
"""預(yù)覽重命名結(jié)果"""
print("\n重命名預(yù)覽:")
print("-" * 50)
rename_map = {}
for i, filename in enumerate(files, start_number):
name, ext = os.path.splitext(filename)
new_name = naming_pattern.format(i) + ext
rename_map[filename] = new_name
print(f"{filename} -> {new_name}")
return rename_map
def execute_rename(self, rename_map):
"""執(zhí)行重命名操作"""
success_count = 0
error_count = 0
for old_name, new_name in rename_map.items():
old_path = os.path.join(self.directory, old_name)
new_path = os.path.join(self.directory, new_name)
# 檢查目標文件是否已存在
if os.path.exists(new_path):
print(f"警告: 文件 '{new_name}' 已存在,跳過 '{old_name}'")
error_count += 1
continue
try:
os.rename(old_path, new_path)
self.rename_log.append((datetime.now(), old_name, new_name))
print(f"成功重命名: {old_name} -> {new_name}")
success_count += 1
except PermissionError:
print(f"權(quán)限錯誤: 無法重命名 '{old_name}',請檢查文件權(quán)限")
error_count += 1
except Exception as e:
print(f"重命名 '{old_name}' 時出錯: {e}")
error_count += 1
print(f"\n重命名完成! 成功: {success_count}, 失敗: {error_count}")
def save_log(self, log_file="rename_log.txt"):
"""保存操作日志"""
try:
with open(os.path.join(self.directory, log_file), "w", encoding="utf-8") as f:
f.write("文件批量重命名操作日志\n")
f.write("=" * 50 + "\n")
f.write(f"操作時間: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
f.write(f"操作目錄: {self.directory}\n\n")
for timestamp, old_name, new_name in self.rename_log:
f.write(f"[{timestamp.strftime('%H:%M:%S')}] {old_name} -> {new_name}\n")
print(f"操作日志已保存到: {log_file}")
except Exception as e:
print(f"保存日志時出錯: {e}")
def main():
parser = argparse.ArgumentParser(description="文件批量重命名工具")
parser.add_argument("directory", help="要處理的目錄路徑")
parser.add_argument("-p", "--pattern", default="file_{:03d}",
help="命名模式,使用 {:03d} 表示序號 (默認: file_{:03d})")
parser.add_argument("-s", "--start", type=int, default=1,
help="起始序號 (默認: 1)")
parser.add_argument("-e", "--extension",
help="文件擴展名過濾 (例如: .jpg)")
parser.add_argument("--preview", action="store_true",
help="僅預(yù)覽,不執(zhí)行實際重命名")
args = parser.parse_args()
try:
renamer = FileBatchRenamer(args.directory)
files = renamer.get_files(extension=args.extension)
if not files:
print("未找到符合條件的文件")
return
print(f"找到 {len(files)} 個文件")
rename_map = renamer.preview_rename(files, args.pattern, args.start)
if args.preview:
print("\n預(yù)覽模式,未執(zhí)行實際重命名操作")
return
confirm = input("\n確認執(zhí)行重命名操作? (y/N): ")
if confirm.lower() == 'y':
renamer.execute_rename(rename_map)
renamer.save_log()
else:
print("操作已取消")
except Exception as e:
print(f"程序執(zhí)行出錯: {e}")
sys.exit(1)
if __name__ == "__main__":
main()
使用方法
基本使用
# 基本用法,對目錄中的所有文件按默認模式重命名
python batch_renamer.py /path/to/directory
# 指定命名模式
python batch_renamer.py /path/to/directory -p "photo_{:04d}"
# 指定起始序號
python batch_renamer.py /path/to/directory -s 100
# 只處理特定擴展名的文件
python batch_renamer.py /path/to/directory -e .jpg
# 預(yù)覽模式(不實際執(zhí)行重命名)
python batch_renamer.py /path/to/directory --preview
命令行參數(shù)說明
directory: 必需參數(shù),指定要處理的目錄路徑-p, --pattern: 命名模式,默認為file_{:03d},其中{:03d}會被替換為序號-s, --start: 起始序號,默認為 1-e, --extension: 文件擴展名過濾器,只處理指定擴展名的文件--preview: 預(yù)覽模式,只顯示重命名結(jié)果,不執(zhí)行實際操作
使用示例
假設(shè)有以下文件:
image1.jpg
image2.jpg
document.pdf
photo.png
執(zhí)行命令:
python batch_renamer.py ./test_dir -p "pic_{:02d}" -e .jpg
結(jié)果:
pic_01.jpg
pic_02.jpg
document.pdf
photo.png
總結(jié)
這個文件批量重命名工具通過簡單的命令行界面提供了強大的批量文件重命名功能。它具有良好的錯誤處理機制,可以有效防止誤操作,并通過日志記錄功能保證操作的可追溯性。無論是日常文件整理還是專業(yè)項目管理,這個工具都能顯著提高工作效率。
到此這篇關(guān)于Python文件管理之批量重命名文件詳解的文章就介紹到這了,更多相關(guān)Python重命名文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3如何使用range函數(shù)替代xrange函數(shù)
這篇文章主要介紹了Python3如何使用range函數(shù)替代xrange函數(shù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10
Python使用python-pptx庫實現(xiàn)PPT自動化
Python PPT自動化極大地提高了PPT制作的效率,從創(chuàng)建新文件、添加文本和圖片,到插入表格和圖表,python-pptx庫幾乎可以實現(xiàn)所有常見的PPT操作,本文就給大家介紹了Python使用python-pptx庫實現(xiàn)PPT自動化的方法,需要的朋友可以參考下2025-08-08
PyTorch CUDA環(huán)境配置及安裝的步驟(圖文教程)
這篇文章主要介紹了PyTorch CUDA環(huán)境配置及安裝的步驟(圖文教程),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
使用django-guardian實現(xiàn)django-admin的行級權(quán)限控制的方法
這篇文章主要介紹了使用django-guardian實現(xiàn)django-admin的行級權(quán)限控制的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
pycharm快捷鍵自動提示documentation問題(auto?Ctrl+Q)
這篇文章主要介紹了pycharm快捷鍵自動提示documentation問題(auto?Ctrl+Q),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04

