Python腳本實(shí)現(xiàn)根據(jù)文件擴(kuò)展名進(jìn)行文件自動(dòng)分類
試想一下,有沒(méi)那么一天,你剛剛結(jié)束工作,重新切回電腦桌面上。文檔、圖片、音頻、視頻等各種格式的文件都堆滿了桌面,想要從桌面找到某個(gè)文件,就像從蛋炒飯里將所有蔥花挑出來(lái)一樣困難。
對(duì)于這種情況,我們可以按照文件擴(kuò)展名,或其他的分類方式,分門別類的將文件整理到不同的目錄。方法雖然找到了,但是手動(dòng)操作起來(lái)的也是很不容易的。
所以,我們今天就一起來(lái)學(xué)習(xí)一下,怎么用 Python 腳本,根據(jù)文件擴(kuò)展名自動(dòng)的將文件進(jìn)行分類。
核心思路
實(shí)現(xiàn)自動(dòng)的文件分類功能,核心有兩個(gè)問(wèn)題:如何定義分類規(guī)則?如何執(zhí)行流程?
1、設(shè)計(jì)分類規(guī)則
首先,我們要根據(jù)文件擴(kuò)展名,把文件放到指定的目錄下。這樣的話,我們就需要建議一個(gè)目錄和擴(kuò)展名的映射關(guān)系。
我們使用“字典”作為核心的數(shù)據(jù)結(jié)構(gòu)。其中,目錄名為鍵,擴(kuò)展名的列表為值。
{
"music": ("mp3", "wav"),
"movie": ("mp4", "rmvb", "rm", "avi"),
"execute": ("exe", "bat")
}
2、設(shè)計(jì)執(zhí)行流程
在這個(gè)業(yè)務(wù)場(chǎng)景下,“文件遍歷”和“文件處理”是兩個(gè)可以分離的步驟,但存在速度不匹配的依賴關(guān)系。所以,這里我們借鑒“生產(chǎn)者-消費(fèi)者”這一經(jīng)典的設(shè)計(jì)模式。
- “生產(chǎn)者”負(fù)責(zé)遍歷目錄下的文件,并將文件信息放入隊(duì)列。
- “消費(fèi)者”負(fù)責(zé)從隊(duì)列中取出文件,并根據(jù)規(guī)則將其移動(dòng)到正確文件夾。
- “隊(duì)列”作為生產(chǎn)者和消費(fèi)者之間的緩沖區(qū)域,解耦兩個(gè)過(guò)程,避免相互等待。
“生產(chǎn)者-消費(fèi)者”模式的優(yōu)勢(shì):
1. 如果生產(chǎn)者快,數(shù)據(jù)可暫存于隊(duì)列,生產(chǎn)者無(wú)需等待。
2. 如果消費(fèi)者快,隊(duì)列空時(shí)消費(fèi)者會(huì)等待,直至新數(shù)據(jù)到來(lái)。
3. 平衡了雙方速度差異,提高程序整體健壯性。
代碼實(shí)現(xiàn)
整個(gè)程序主要由以下幾個(gè)函數(shù)構(gòu)成:
1、創(chuàng)建分類目錄
根據(jù)分類規(guī)則字典,在指定目錄下提前創(chuàng)建好分類目錄。
實(shí)現(xiàn)代碼如下:
def make_new_dir(root_dir: Path, dir_names: Iterable):
for dir_name in dir_names:
target_dir = root_dir / dir_name
# mkdir 的 exist_ok=True 參數(shù)會(huì)避免目錄已存在的錯(cuò)誤
target_dir.mkdir(exist_ok=True)
上面代碼中,root_dir: Path 參數(shù)是一個(gè)根路徑,dir_names: Iterable 參數(shù)是一個(gè)分類目錄集合。
2、生產(chǎn)者:遍歷目錄并寫入隊(duì)列
使用 root_dir.iterdir() 方法遍歷源目錄,將每個(gè)子文件存入隊(duì)列。
實(shí)現(xiàn)代碼如下:
def write_to_q(root_dir: Path, q: Queue):
?
for file_path in root_dir.iterdir():
if file_path.is_file():
print(f"write_to_q... Adding {file_path.resolve()}")
q.put(file_path.resolve())
3、消費(fèi)者:獲取隊(duì)列中的文件信息,并移動(dòng)文件
從隊(duì)列中取出數(shù)據(jù),解析出文件路徑,然后調(diào)用函數(shù)進(jìn)行處理。
實(shí)現(xiàn)代碼如下:
def classify_from_q(q: Queue, type_to_classify: dict):
dir_map = build_extension_to_dir(type_to_classify)
print(f"classify_from_q... Starting... with a total of {q.qsize()} files.")
while not q.empty():
filepath: Path = q.get()
print(f"classify_from_q... Getting {filepath}")
file_suffix = filepath.suffix.lstrip(".")
dir_name = dir_map.get(file_suffix)
if dir_name:
target_filepath = filepath.parent / dir_name / filepath.name
move_new_dir(filepath, target_filepath)
?
# 休息一下
sleep(0.5)
?
?
def move_new_dir(source_filepath: Path, target_filepath: Path):
# 確保目標(biāo)目錄存在
target_filepath.parent.mkdir(parents=True, exist_ok=True)
?
# 移動(dòng)文件
source_filepath.rename(target_filepath)
print(f"move_new_dir... File moved successfully... {source_filepath} --> {target_filepath}")
?
?
def build_extension_to_dir(file_types: dict):
extension_to_dir = {}
for dir_name, extensions in file_types.items():
for ext in extensions:
extension_to_dir[ext] = dir_name
?
print(f"build_extension_to_dir... {extension_to_dir}")
return extension_to_dir
classify_from_q 函數(shù)消費(fèi)隊(duì)列中的文件信息,并構(gòu)建執(zhí)行流程。
move_new_dir 函數(shù)實(shí)現(xiàn)了文件移動(dòng)功能。
build_extension_to_dir 函數(shù)實(shí)現(xiàn)了反向字典查找功能,構(gòu)建一個(gè)根據(jù)擴(kuò)展名查詢分類目錄的字典。
# 構(gòu)建字典
file_types = {
"music": ("mp3", "wav"),
"movie": ("mp4", "rmvb", "rm", "avi"),
"execute": ("exe", "bat")
}
?
# 構(gòu)建出的反向查找字典
{
'mp3': 'music',
'wav': 'music',
'mp4': 'movie',
'rmvb': 'movie',
'rm': 'movie',
'avi': 'movie',
'exe': 'execute',
'bat': 'execute'
}
總結(jié)
今天,我們不僅學(xué)會(huì)了一個(gè)自動(dòng)整理文件的Python腳本,更體驗(yàn)了如何用編程思維解決實(shí)際問(wèn)題。
面對(duì)復(fù)雜任務(wù)時(shí), “拆分功能” 和 “模式復(fù)用” 是關(guān)鍵一步。通過(guò)函數(shù)封裝每個(gè)步驟,再借助經(jīng)典的生產(chǎn)者-消費(fèi)者模式組合流程,代碼變得清晰、健壯,更容易應(yīng)對(duì)未來(lái)更復(fù)雜的需求。
這才是高效辦公的真諦:不是拼命手動(dòng)操作,而是讓機(jī)器自動(dòng)工作,把精力留給真正重要的思考。
到此這篇關(guān)于Python腳本實(shí)現(xiàn)根據(jù)文件擴(kuò)展名進(jìn)行文件自動(dòng)分類的文章就介紹到這了,更多相關(guān)Python文件分類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python將Excel轉(zhuǎn)換為HTML的代碼詳解
在企業(yè)數(shù)據(jù)管理與信息分享場(chǎng)景中,Excel文件雖然功能強(qiáng)大,但在跨平臺(tái)瀏覽、在線展示和快速分享方面存在局限性,然而,手動(dòng)將Excel轉(zhuǎn)換為 HTML 不僅操作繁瑣,還難以保持原有的格式,所以本文將介紹如何使用Python將Excel工作表或整個(gè)工作簿轉(zhuǎn)換為HTML格式2026-06-06
python中的selenium安裝的步驟(瀏覽器自動(dòng)化測(cè)試框架)
這篇文章主要介紹了python中的selenium安裝的步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
樹莓派安裝OpenCV3完整過(guò)程的實(shí)現(xiàn)
這篇文章主要介紹了樹莓派安裝OpenCV3完整過(guò)程的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
Python面向?qū)ο蟪绦蛟O(shè)計(jì)類的封裝與繼承用法示例
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計(jì)類的封裝與繼承用法,結(jié)合實(shí)例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類的封裝、繼承相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2019-04-04
Python根據(jù)當(dāng)前日期取去年同星期日期
最近做項(xiàng)目,遇到這樣的業(yè)務(wù)開發(fā)需求,需要對(duì)比當(dāng)前時(shí)間段和去年同星期的時(shí)間段的數(shù)據(jù),下面小編通過(guò)實(shí)例代碼給大家分享Python根據(jù)當(dāng)前日期取去年同星期日期,需要的朋友參考下2019-04-04
Numpy數(shù)組的廣播機(jī)制的實(shí)現(xiàn)
這篇文章主要介紹了Numpy數(shù)組的廣播機(jī)制的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

