S系列·刪除文件夾的幾種姿勢
S系列·刪除文件夾的幾種姿勢
S又稱水,亦可讀作Small,在日常工作學(xué)習(xí)過程中,偶爾會發(fā)現(xiàn)之前沒有看見的、小的、有趣的操作,或許這些操作對于當(dāng)下的問題解決并無意義,仍然想記錄下來,或許能以單獨(dú)寫成一篇完整的文章,則作為流水賬似的記下。
系列文章說明:
S系列·<<文章名稱>>
平臺:
windows 10.0
python 3.8
pywin32 227 (或者安裝pypiwin32)
send2trash 1.5.0
目的
將一個包含數(shù)據(jù)文件的目錄刪除。
刪除姿勢
以下操作均在windows系統(tǒng)中操作。
姿勢一
直接在電腦上右擊該文件夾,選擇刪除,或者使還原即可。
姿勢二
在python中使用使用os模塊:
import?os
delete_dir?=?r'測試文件夾'
for?r,?d,?f?in?os.walk(delete_dir,?topdown=False):
????for?files?in?f:
????????os.remove(os.path.join(r,?files))?#?刪除文件
????os.removedirs(r)??#?刪除文件夾,必須為空
使用os.walk遍歷待刪除文件的內(nèi)容,默認(rèn)topdown=True,先輸出最外層的再輸出內(nèi)層,此時會先將非空的文件夾輸出,而是用os.removedirs刪除非空文件夾會嘗試報錯,將topdown=False,先將內(nèi)層文件逐個輸出并刪除,最后再刪除上層的文件夾,直至全部刪除。
姿勢三
pathlib模塊:
from?pathlib?import?Path
delete_dir?=?Path(r'測試文件夾')
#?刪除所有文件
[i.unlink()?for?i?in?delete_dir.rglob('*')?if?i.is_file()]
#?刪除包含的所有空文件夾
[i.rmdir()?for?i?in?delete_dir.rglob('*')?if?i.is_dir()]
#?刪除當(dāng)前文件夾
delete_dir.rmdir()
與os類似,將文件與文件夾分開刪除,兩次遞歸分別判斷是否為文件或者目錄,并按照對應(yīng)刪除方式刪除,最后刪除當(dāng)前文件夾。
姿勢四
shutil模塊
from?shutil?import?rmtree
delete_dir?=?r'測試文件夾'
rmtree(delete_dir)
rmtree遞歸返回該目錄下所有文件及文件夾,并將其刪除,原理同姿勢二,以下為rmtree核心代碼部分:


rmtree首先判斷刪除方式是否為安全刪除,以安全刪除方式為例,對遞歸結(jié)果進(jìn)行判斷,如果為文件夾,判斷內(nèi)層是否還有文件,如果還有進(jìn)行遞歸,再對遞歸結(jié)果做刪除操作,如果為文件,直接進(jìn)行刪除,此種方式相比姿勢二有了更多對文件狀態(tài)的判斷。
send2trash+shell
上述幾種python方法刪除文件會直接刪除,不會經(jīng)過回收站,如果想類似于姿勢一的操作,可安裝send2trash模塊,將文件轉(zhuǎn)移至回收站。
pip install send2trash
pip install pywin32 (或者 pip install pypiwin32)
import?send2trash
delete_dir?=?r'測試文件夾'
send2trash.send2trash(delete_dir)
win32com是pywin32包中的一個模塊,調(diào)用shell方法對回收站做處理。
from?win32com.shell?import?shell,?shellcon
def?recyclebin_empty(confirm=True,?show_progress=True,?sound=True):
????flags?=?0
????if?not?confirm:??#?提示框
????????flags?|=?shellcon.SHERB_NOCONFIRMATION
????if?not?show_progress:??#?刪除進(jìn)度
????????flags?|=?shellcon.SHERB_NOPROGRESSUI
????if?not?sound:??#?完成提示音
????????flags?|=?shellcon.SHERB_NOSOUND
????shell.SHEmptyRecycleBin(None,?None,?flags)??
recyclebin_empty(False,?False,?False)
定義一個函數(shù),設(shè)置默認(rèn)會顯示清空回收站提示框,顯示進(jìn)度及刪除完提示音。兩個函數(shù)相結(jié)合可以實現(xiàn)姿勢一的操作過程。
總結(jié)
本文通過幾種姿勢,對需要刪除的文件進(jìn)行刪除操作,純分享個人感悟,刪除文件基本是有手就行,之前使用電腦偶然抽風(fēng),直接使用shutil.rmtree進(jìn)行刪除偶有卡頓,原以為這種刪除方式很慢,遂上網(wǎng)搜索了一番,而后用pathlib模塊卻能夠快速刪除,正當(dāng)我想分享此事時,我重啟電腦再次運(yùn)行,發(fā)現(xiàn)shutil.rmtree能較快刪除,經(jīng)幾次測試,shutil.rmtree相比pathlib刪除速度較快,為何那時刪除時間較長原因未知。??
此山中煙雨,獨(dú)留文人騷客。??
2022.6.8留
