Python文件管理之批量重命名文件詳解
簡(jiǎn)介
在日常工作中,我們經(jīng)常需要對(duì)大量文件進(jìn)行重命名操作,特別是在整理照片、文檔或其他媒體文件時(shí)。手動(dòng)一個(gè)個(gè)重命名不僅耗時(shí),還容易出錯(cuò)。本文將介紹一個(gè)實(shí)用的Python腳本——文件批量重命名工具,它可以大大提高我們的工作效率。
功能介紹
這個(gè)文件批量重命名工具具有以下核心功能:
- 批量重命名:可以同時(shí)對(duì)多個(gè)文件按照指定規(guī)則進(jìn)行重命名
- 多種命名模式:支持序號(hào)命名、前綴命名、后綴命名等多種模式
- 文件過(guò)濾:可以根據(jù)文件擴(kuò)展名、文件名特征等條件篩選文件
- 預(yù)覽功能:在實(shí)際執(zhí)行前可以預(yù)覽重命名結(jié)果
- 撤銷(xiāo)功能:支持操作撤銷(xiāo),防止誤操作
- 日志記錄:記錄所有操作歷史,便于追蹤和審計(jì)
應(yīng)用場(chǎng)景
這個(gè)工具適用于以下場(chǎng)景:
- 照片整理:將相機(jī)拍攝的照片按日期或序號(hào)統(tǒng)一命名
- 文檔管理:對(duì)公司或個(gè)人文檔進(jìn)行規(guī)范化命名
- 下載文件整理:對(duì)下載的文件進(jìn)行批量重命名以提高可讀性
- 開(kāi)發(fā)項(xiàng)目:對(duì)代碼文件或資源文件進(jìn)行統(tǒng)一命名規(guī)范
- 學(xué)術(shù)研究:對(duì)實(shí)驗(yàn)數(shù)據(jù)文件進(jìn)行有序命名
報(bào)錯(cuò)處理
腳本包含了完善的錯(cuò)誤處理機(jī)制:
- 路徑不存在:檢查指定目錄是否存在,若不存在則提示用戶
- 權(quán)限不足:檢測(cè)文件操作權(quán)限,權(quán)限不足時(shí)給出明確提示
- 文件沖突:檢測(cè)目標(biāo)文件名是否已存在,避免覆蓋重要文件
- 參數(shù)驗(yàn)證:驗(yàn)證用戶輸入的參數(shù)是否合法
- 異常捕獲:捕獲并處理運(yùn)行過(guò)程中可能出現(xiàn)的各種異常
代碼實(shí)現(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}' 不是一個(gè)有效的目錄")
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ù)擴(kuò)展名過(guò)濾
if extension and not file.endswith(extension):
continue
# 根據(jù)模式過(guò)濾
if pattern and pattern not in file:
continue
filtered_files.append(file)
return sorted(filtered_files)
except Exception as e:
print(f"獲取文件列表時(shí)出錯(cuò): {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)
# 檢查目標(biāo)文件是否已存在
if os.path.exists(new_path):
print(f"警告: 文件 '{new_name}' 已存在,跳過(guò) '{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)限錯(cuò)誤: 無(wú)法重命名 '{old_name}',請(qǐng)檢查文件權(quán)限")
error_count += 1
except Exception as e:
print(f"重命名 '{old_name}' 時(shí)出錯(cuò): {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"操作時(shí)間: {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"保存日志時(shí)出錯(cuò): {e}")
def main():
parser = argparse.ArgumentParser(description="文件批量重命名工具")
parser.add_argument("directory", help="要處理的目錄路徑")
parser.add_argument("-p", "--pattern", default="file_{:03d}",
help="命名模式,使用 {:03d} 表示序號(hào) (默認(rèn): file_{:03d})")
parser.add_argument("-s", "--start", type=int, default=1,
help="起始序號(hào) (默認(rèn): 1)")
parser.add_argument("-e", "--extension",
help="文件擴(kuò)展名過(guò)濾 (例如: .jpg)")
parser.add_argument("--preview", action="store_true",
help="僅預(yù)覽,不執(zhí)行實(shí)際重命名")
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)} 個(gè)文件")
rename_map = renamer.preview_rename(files, args.pattern, args.start)
if args.preview:
print("\n預(yù)覽模式,未執(zhí)行實(shí)際重命名操作")
return
confirm = input("\n確認(rè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í)行出錯(cuò): {e}")
sys.exit(1)
if __name__ == "__main__":
main()
使用方法
基本使用
# 基本用法,對(duì)目錄中的所有文件按默認(rèn)模式重命名
python batch_renamer.py /path/to/directory
# 指定命名模式
python batch_renamer.py /path/to/directory -p "photo_{:04d}"
# 指定起始序號(hào)
python batch_renamer.py /path/to/directory -s 100
# 只處理特定擴(kuò)展名的文件
python batch_renamer.py /path/to/directory -e .jpg
# 預(yù)覽模式(不實(shí)際執(zhí)行重命名)
python batch_renamer.py /path/to/directory --preview
命令行參數(shù)說(shuō)明
directory: 必需參數(shù),指定要處理的目錄路徑-p, --pattern: 命名模式,默認(rèn)為file_{:03d},其中{:03d}會(huì)被替換為序號(hào)-s, --start: 起始序號(hào),默認(rèn)為 1-e, --extension: 文件擴(kuò)展名過(guò)濾器,只處理指定擴(kuò)展名的文件--preview: 預(yù)覽模式,只顯示重命名結(jié)果,不執(zhí)行實(shí)際操作
使用示例
假設(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é)
這個(gè)文件批量重命名工具通過(guò)簡(jiǎn)單的命令行界面提供了強(qiáng)大的批量文件重命名功能。它具有良好的錯(cuò)誤處理機(jī)制,可以有效防止誤操作,并通過(guò)日志記錄功能保證操作的可追溯性。無(wú)論是日常文件整理還是專(zhuān)業(yè)項(xiàng)目管理,這個(gè)工具都能顯著提高工作效率。
到此這篇關(guān)于Python文件管理之批量重命名文件詳解的文章就介紹到這了,更多相關(guān)Python重命名文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python文本到語(yǔ)音轉(zhuǎn)換庫(kù)pyttsx3的安裝及使用全面指南
這篇文章主要介紹了Python的text-to-speech庫(kù)pyttsx3的安裝、基本用法、配置語(yǔ)音屬性、支持的命令和功能以及高級(jí)用法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03
python 線程池順序執(zhí)行的方法實(shí)現(xiàn)
在Python中,線程池默認(rèn)是并發(fā)執(zhí)行任務(wù)的,但若需要實(shí)現(xiàn)任務(wù)的順序執(zhí)行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
Python爬蟲(chóng)基礎(chǔ)講解之請(qǐng)求
今天帶大家了解一下python爬蟲(chóng)的基礎(chǔ)知識(shí),文中有非常詳細(xì)的解釋說(shuō)明,對(duì)正在學(xué)習(xí)python爬蟲(chóng)的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05
python+mysql實(shí)現(xiàn)簡(jiǎn)單的web程序
上篇文章我們介紹了簡(jiǎn)單的Python web程序,實(shí)現(xiàn)hello world,本文我們來(lái)結(jié)合一下mysql,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的簡(jiǎn)單操作,希望對(duì)大家有所幫助2014-09-09
詳解Django模板層過(guò)濾器和繼承的問(wèn)題
今天抽空給大家介紹Django模板層過(guò)濾器和繼承的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-07
Python?lambda函數(shù)保姆級(jí)使用教程
本文和你一起探索Python中的lambda函數(shù),讓你以最短的時(shí)間明白這個(gè)函數(shù)的原理。也可以利用碎片化的時(shí)間鞏固這個(gè)函數(shù),讓你在處理工作過(guò)程中更高效2022-06-06

