使用Python進(jìn)行一鍵整理文件,自動(dòng)分類DOCX與PDF
你是否經(jīng)常面對(duì)這樣的場(chǎng)景:下載的文檔、工作報(bào)告、學(xué)習(xí)資料混在一個(gè)文件夾里,DOCX和PDF文件雜亂無(wú)章,想找一個(gè)文件需要翻半天?手動(dòng)新建文件夾、逐個(gè)移動(dòng)文件不僅浪費(fèi)時(shí)間,還容易遺漏或誤操作。

今天,我們將實(shí)現(xiàn)一個(gè)零依賴的Python自動(dòng)化腳本——只需指定目標(biāo)文件夾,它就能自動(dòng)識(shí)別DOCX和PDF文件,分別移動(dòng)到專屬子文件夾中,還能實(shí)時(shí)反饋移動(dòng)進(jìn)度、統(tǒng)計(jì)文件數(shù)量,并處理異常情況(如文件被占用)。即使是Python新手,也能3分鐘上手!
一、環(huán)境準(zhǔn)備:零依賴,開(kāi)箱即用
這個(gè)腳本的核心優(yōu)勢(shì)之一是無(wú)需安裝任何第三方庫(kù),完全基于Python標(biāo)準(zhǔn)庫(kù)開(kāi)發(fā),兼容性極強(qiáng)。只要你的電腦安裝了Python(3.4及以上版本),就能直接運(yùn)行。
1. 核心依賴庫(kù)(均為Python標(biāo)準(zhǔn)庫(kù))
腳本中用到的3個(gè)庫(kù)均隨Python默認(rèn)安裝,無(wú)需額外執(zhí)行pip install:
os:輔助路徑處理(本腳本中主要用于配合Path對(duì)象,確保路徑兼容性)。shutil:提供文件移動(dòng)、復(fù)制等核心操作,是實(shí)現(xiàn)“整理文件”的關(guān)鍵。pathlib.Path:Python 3.4+引入的路徑操作庫(kù),比傳統(tǒng)的os.path更簡(jiǎn)潔、更直觀,還能自動(dòng)處理Windows/macOS/Linux的路徑差異(如\和/)。
2. Python版本要求
推薦使用Python 3.6及以上版本(Path.glob方法在3.4+已支持,但高版本在異常處理和編碼兼容性上更優(yōu))。
3. 跨平臺(tái)支持
腳本可在Windows、macOS、Linux系統(tǒng)上直接運(yùn)行,僅需修改“源目錄路徑”(如Windows的D:\data、macOS的/Users/xxx/Documents),無(wú)需調(diào)整代碼邏輯。
二、完整源代碼以及解析
先看完整可運(yùn)行代碼,再分模塊拆解核心邏輯,幫你吃透每一步的設(shè)計(jì)思路:
import os
import shutil
from pathlib import Path
def organize_files(source_dir):
# 轉(zhuǎn)換為Path對(duì)象
source_path = Path(source_dir)
# 創(chuàng)建目標(biāo)文件夾
docx_folder = source_path / "docx"
pdf_folder = source_path / "pdf"
# 確保目標(biāo)文件夾存在
docx_folder.mkdir(exist_ok=True)
pdf_folder.mkdir(exist_ok=True)
# 計(jì)數(shù)器
docx_count = 0
pdf_count = 0
# 獲取源目錄中的所有文件
for file_path in source_path.glob("*"):
# 跳過(guò)文件夾
if file_path.is_dir():
continue
# 處理.docx文件
if file_path.suffix.lower() == ".docx":
target_path = docx_folder / file_path.name
try:
shutil.move(str(file_path), str(target_path))
docx_count += 1
print(f"已移動(dòng): {file_path.name} -> docx文件夾")
except Exception as e:
print(f"移動(dòng) {file_path.name} 失敗: {str(e)}")
# 處理.pdf文件
elif file_path.suffix.lower() == ".pdf":
target_path = pdf_folder / file_path.name
try:
shutil.move(str(file_path), str(target_path))
pdf_count += 1
print(f"已移動(dòng): {file_path.name} -> pdf文件夾")
except Exception as e:
print(f"移動(dòng) {file_path.name} 失敗: {str(e)}")
print(f"\n整理完成!")
print(f"已移動(dòng) {docx_count} 個(gè)DOCX文件到 {docx_folder}")
print(f"已移動(dòng) {pdf_count} 個(gè)PDF文件到 {pdf_folder}")
if __name__ == "__main__":
# 源目錄
source_directory = r"D:\data"
organize_files(source_directory)
1. 核心函數(shù):organize_files(source_dir)
這個(gè)函數(shù)是腳本的“心臟”,負(fù)責(zé)從“路徑處理”到“文件移動(dòng)”的全流程,我們分10個(gè)關(guān)鍵步驟拆解:
步驟1:路徑對(duì)象化(source_path = Path(source_dir))
- 為什么不用字符串路徑?
Path對(duì)象能自動(dòng)處理不同系統(tǒng)的路徑分隔符(Windows用\,macOS用/),比如在macOS中寫source_directory = "/Users/xxx/data",腳本也能正常運(yùn)行,無(wú)需修改代碼。 - 后續(xù)所有路徑操作(如創(chuàng)建子文件夾、拼接文件名)都基于
Path對(duì)象,代碼更簡(jiǎn)潔。
步驟2-3:創(chuàng)建目標(biāo)子文件夾
docx_folder = source_path / "docx" pdf_folder.mkdir(exist_ok=True)
source_path / "docx":等價(jià)于在源目錄下拼接“docx”子文件夾路徑(類似字符串拼接,但更安全)。mkdir(exist_ok=True):核心參數(shù)——如果“docx”文件夾已存在,不會(huì)報(bào)錯(cuò);如果不存在,則自動(dòng)創(chuàng)建。避免了手動(dòng)判斷“文件夾是否存在”的冗余代碼。
步驟4:初始化計(jì)數(shù)器
docx_count和pdf_count用于統(tǒng)計(jì)移動(dòng)成功的文件數(shù)量,最終在控制臺(tái)打印,讓用戶直觀知道整理效果(比如“移動(dòng)了5個(gè)DOCX、3個(gè)PDF”)。
步驟5:遍歷源目錄文件(source_path.glob("*"))
glob("*"):遍歷源目錄下的所有內(nèi)容(包括文件和子文件夾),返回一個(gè)迭代器。- 后續(xù)用
file_path.is_dir()跳過(guò)子文件夾,確保只處理“文件”,避免誤移動(dòng)用戶已有的其他目錄(比如源目錄下已有“圖片”文件夾,不會(huì)被腳本處理)。
步驟6-7:按文件類型移動(dòng)(核心邏輯)
這是腳本的核心功能,以DOCX文件為例:
- 后綴判斷:
file_path.suffix.lower() == ".docx"——suffix獲取文件后綴(如.docx),lower()將后綴轉(zhuǎn)為小寫,確保.DOCX(大寫)、.Docx(混合大小寫)也能被識(shí)別,兼容性更強(qiáng)。 - 目標(biāo)路徑拼接:
target_path = docx_folder / file_path.name——file_path.name獲取文件名(如“報(bào)告.docx”),確保移動(dòng)后文件名不變,用戶容易找到。 - 文件移動(dòng):
shutil.move(str(file_path), str(target_path))——shutil.move是Python標(biāo)準(zhǔn)庫(kù)中用于“移動(dòng)文件/目錄”的函數(shù),這里將Path對(duì)象轉(zhuǎn)為字符串(部分舊版本shutil對(duì)Path支持不足,兼容處理)。 - 異常捕獲:
try-except塊是腳本“健壯性”的關(guān)鍵——如果文件被其他程序占用(如Word打開(kāi)了“報(bào)告.docx”),腳本不會(huì)崩潰,而是打印錯(cuò)誤原因(如“ PermissionError: [WinError 32] 另一個(gè)程序正在使用此文件”),并繼續(xù)處理下一個(gè)文件。
步驟8:打印統(tǒng)計(jì)結(jié)果
整理完成后,清晰顯示“移動(dòng)了多少個(gè)文件”“移動(dòng)到哪個(gè)路徑”,避免用戶“不知道有沒(méi)有整理成功”的困惑。
2. 主程序入口(if __name__ == "__main__":)
定義“源目錄”(source_directory):這是用戶唯一需要修改的地方,需填寫你要整理的文件夾路徑。
- Windows示例:
source_directory = r"D:\data"(r表示“原始字符串”,避免\被當(dāng)作轉(zhuǎn)義符,比如D:\data不會(huì)變成D:data)。 - macOS/Linux示例:
source_directory = "/Users/yourname/Documents"(直接用/分隔路徑)。
調(diào)用organize_files(source_directory):執(zhí)行文件整理邏輯。
三、實(shí)戰(zhàn)使用:3步完成文件整理
掌握代碼邏輯后,我們以Windows系統(tǒng)為例,實(shí)際運(yùn)行腳本,感受“一鍵整理”的便捷:
步驟1:修改“源目錄”路徑
打開(kāi)腳本,找到source_directory = r"D:\data",將路徑改為你要整理的文件夾,比如:
source_directory = r"C:\Users\你的用戶名\Desktop\雜亂文件"
提示:如果不知道文件夾路徑,可以打開(kāi)文件夾,在地址欄復(fù)制路徑,直接粘貼到腳本中(Windows路徑記得加r前綴)。
步驟2:運(yùn)行腳本
打開(kāi)“命令提示符”(Win+R,輸入cmd回車)。
運(yùn)行腳本(假設(shè)腳本名為file_organizer.py):
python file_organizer.py
步驟3:查看整理結(jié)果
運(yùn)行后會(huì)看到類似以下的輸出:
已移動(dòng): 項(xiàng)目方案.docx -> docx文件夾
已移動(dòng): 會(huì)議記錄.DOCX -> docx文件夾(注意:大寫后綴也能識(shí)別)
已移動(dòng): 產(chǎn)品手冊(cè).pdf -> pdf文件夾
移動(dòng) 財(cái)務(wù)報(bào)表.pdf 失敗: [WinError 32] 另一個(gè)程序正在使用此文件,進(jìn)程無(wú)法訪問(wèn)。
已移動(dòng): 需求文檔.docx -> docx文件夾
整理完成!
已移動(dòng) 3 個(gè)DOCX文件到 C:\Users\你的用戶名\Desktop\雜亂文件\docx
已移動(dòng) 1 個(gè)PDF文件到 C:\Users\你的用戶名\Desktop\雜亂文件\pdf
- 打開(kāi)源目錄,會(huì)發(fā)現(xiàn)自動(dòng)生成了
docx和pdf兩個(gè)子文件夾,所有未被占用的DOCX/PDF文件已分別移動(dòng)到對(duì)應(yīng)文件夾中。 - 失敗的文件(如“財(cái)務(wù)報(bào)表.pdf”)會(huì)保留在源目錄,關(guān)閉占用它的程序(如Adobe Reader)后,重新運(yùn)行腳本即可移動(dòng)。
四、常見(jiàn)問(wèn)題與解決方案
在使用過(guò)程中,可能會(huì)遇到一些小問(wèn)題,這里整理了高頻場(chǎng)景及解決方法,幫你快速排查:
| 問(wèn)題現(xiàn)象 | 可能原因 | 解決方案 |
|---|---|---|
| 腳本提示“移動(dòng)失敗:另一個(gè)程序正在使用此文件” | 目標(biāo)文件被Word、Adobe Reader等程序打開(kāi) | 關(guān)閉對(duì)應(yīng)的程序(如關(guān)閉Word窗口、PDF閱讀器),重新運(yùn)行腳本 |
| 腳本提示“PermissionError:權(quán)限不足” | 源目錄或目標(biāo)文件夾無(wú)寫入權(quán)限(如系統(tǒng)目錄、管理員創(chuàng)建的文件夾) | 1. 右鍵點(diǎn)擊“命令提示符”,選擇“以管理員身份運(yùn)行”; 2. 或把文件移動(dòng)到非系統(tǒng)目錄(如桌面、Documents) |
| 腳本沒(méi)移動(dòng)任何文件,但源目錄有DOCX/PDF | 1. 源目錄路徑寫錯(cuò)(如D:\data寫成D:data); 2. 文件后綴是.doc(非.docx)或.PDF(腳本已處理小寫,此情況較少) | 1. 核對(duì)source_directory路徑,確保與文件夾地址欄一致; 2. 若為.doc文件,可手動(dòng)轉(zhuǎn)為.docx,或擴(kuò)展腳本支持.doc |
| 腳本報(bào)錯(cuò)“FileNotFoundError:[WinError 3] 系統(tǒng)找不到指定的路徑” | 源目錄不存在(如D:\data文件夾未創(chuàng)建) | 先在對(duì)應(yīng)路徑創(chuàng)建文件夾(如手動(dòng)新建D:\data),再運(yùn)行腳本 |
五、進(jìn)階擴(kuò)展:讓腳本更強(qiáng)大
基礎(chǔ)腳本已能滿足“分類DOCX/PDF”的需求,但我們還可以根據(jù)實(shí)際場(chǎng)景擴(kuò)展功能,讓它適配更多使用場(chǎng)景:
1. 支持更多文件類型(如TXT、JPG)
如果想同時(shí)整理TXT文檔和JPG圖片,只需添加對(duì)應(yīng)的目標(biāo)文件夾和判斷邏輯:
# 新增目標(biāo)文件夾
txt_folder = source_path / "txt"
jpg_folder = source_path / "jpg"
# 確保文件夾存在
txt_folder.mkdir(exist_ok=True)
jpg_folder.mkdir(exist_ok=True)
# 新增計(jì)數(shù)器
txt_count = 0
jpg_count = 0
# 新增TXT文件處理邏輯
elif file_path.suffix.lower() == ".txt":
target_path = txt_folder / file_path.name
try:
shutil.move(str(file_path), str(target_path))
txt_count += 1
print(f"已移動(dòng): {file_path.name} -> txt文件夾")
except Exception as e:
print(f"移動(dòng) {file_path.name} 失敗: {str(e)}")
# 新增JPG文件處理邏輯(同理可添加.png、.gif等)
elif file_path.suffix.lower() in [".jpg", ".jpeg"]:
target_path = jpg_folder / file_path.name
try:
shutil.move(str(file_path), str(target_path))
jpg_count += 1
print(f"已移動(dòng): {file_path.name} -> jpg文件夾")
except Exception as e:
print(f"移動(dòng) {file_path.name} 失敗: {str(e)}")
# 最后更新統(tǒng)計(jì)結(jié)果
print(f"已移動(dòng) {txt_count} 個(gè)TXT文件到 {txt_folder}")
print(f"已移動(dòng) {jpg_count} 個(gè)JPG文件到 {jpg_folder}")
2. 處理子文件夾中的文件(遞歸整理)
默認(rèn)腳本只處理“源目錄一級(jí)目錄”的文件,若想整理源目錄下所有子文件夾中的DOCX/PDF,只需修改glob參數(shù)為**/*(遞歸匹配所有文件):
# 原代碼:只處理一級(jí)目錄
# for file_path in source_path.glob("*"):
# 修改后:遞歸處理所有子文件夾中的文件
for file_path in source_path.glob("**/*"):
注意:遞歸整理時(shí),仍會(huì)跳過(guò)子文件夾(if file_path.is_dir(): continue),只移動(dòng)文件。
3. 避免同名文件覆蓋
如果目標(biāo)文件夾中已有同名文件(如docx文件夾已存在“報(bào)告.docx”),shutil.move會(huì)直接覆蓋舊文件。若想避免覆蓋,可在移動(dòng)前判斷目標(biāo)路徑是否存在,若存在則重命名(如“報(bào)告_1.docx”):
# 以DOCX文件為例,修改目標(biāo)路徑邏輯
if file_path.suffix.lower() == ".docx":
target_path = docx_folder / file_path.name
# 若目標(biāo)路徑已存在,添加序號(hào)(如“報(bào)告_1.docx”)
count = 1
while target_path.exists():
# 分離文件名和后綴:如“報(bào)告.docx” -> “報(bào)告”和“.docx”
name = file_path.stem
suffix = file_path.suffix
# 重命名目標(biāo)路徑:報(bào)告_1.docx、報(bào)告_2.docx...
target_path = docx_folder / f"{name}_{count}{suffix}"
count += 1
# 后續(xù)移動(dòng)邏輯不變...
自動(dòng)化的本質(zhì)是“把重復(fù)工作交給代碼”——這個(gè)腳本雖然簡(jiǎn)單,但能幫你節(jié)省大量手動(dòng)整理文件的時(shí)間,尤其適合經(jīng)常處理文檔的職場(chǎng)人、學(xué)生。如果你的工作中需要整理其他類型的文件(如表格、圖片),也可以基于本文的擴(kuò)展思路,修改腳本適配更多場(chǎng)景。
到此這篇關(guān)于使用Python進(jìn)行一鍵整理文件,自動(dòng)分類DOCX與PDF的文章就介紹到這了,更多相關(guān)Python整理文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中取絕對(duì)值簡(jiǎn)單方法總結(jié)
在本篇內(nèi)容里小編給大家整理的是關(guān)于python中取絕對(duì)值簡(jiǎn)單方法,需要的朋友們可以學(xué)習(xí)下。2020-07-07
Python-apply(lambda x: )的使用及說(shuō)明
這篇文章主要介紹了Python-apply(lambda x: )的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
python?實(shí)現(xiàn)?mp3Play?音頻播放
這篇文章主要介紹了python?實(shí)現(xiàn)?mp3Play?音頻播放,文章基于python的相關(guān)資料展開(kāi)詳細(xì)內(nèi)容,具有一定的參考價(jià)值需要的小伙伴可以參考一下2022-04-04
如何用 Python 子進(jìn)程關(guān)閉 Excel 自動(dòng)化中的彈窗
這篇文章主要介紹了如何用 Python 子進(jìn)程關(guān)閉 Excel 自動(dòng)化中的彈窗,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-05-05
Pytorch如何把Tensor轉(zhuǎn)化成圖像可視化
這篇文章主要介紹了Pytorch如何把Tensor轉(zhuǎn)化成圖像可視化問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Python初學(xué)者常見(jiàn)錯(cuò)誤詳解
這篇文章主要介紹了Python初學(xué)者常見(jiàn)錯(cuò)誤詳解,即便是有編程經(jīng)驗(yàn)的程序員,也容易按照固有的思維和語(yǔ)法格式來(lái)寫 Python 代碼,需要的朋友可以參考下2019-07-07
Python 調(diào)用PIL庫(kù)失敗的解決方法
今天小編就為大家分享一篇Python 調(diào)用PIL庫(kù)失敗的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
詳解Python 實(shí)現(xiàn)元胞自動(dòng)機(jī)中的生命游戲(Game of life)
本篇文章主要介紹了詳解Python 實(shí)現(xiàn)元胞自動(dòng)機(jī)中的生命游戲(Game of life),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

