用Python刪除本地目錄下某一時(shí)間點(diǎn)之前創(chuàng)建的所有文件的實(shí)例
因?yàn)楣ぷ髟?,需要定期清理某個(gè)文件夾下面創(chuàng)建時(shí)間超過1年的所有文件,所以今天集中學(xué)習(xí)了一下Python對(duì)于本地文件及文件夾的操作。網(wǎng)上 這篇文章 簡明扼要地整理出最常見的os方法,抄襲如下:
os.listdir(dirname):列出dirname下的目錄和文件 os.getcwd():獲得當(dāng)前工作目錄 os.curdir:返回當(dāng)前目錄('.') os.chdir(dirname):改變工作目錄到dirname os.path.isdir(name):判斷name是不是一個(gè)目錄,name不是目錄就返回false os.path.isfile(name):判斷name是不是一個(gè)文件,不存在name也返回false os.path.exists(name):判斷是否存在文件或目錄name os.path.getsize(name):獲得文件大小,如果name是目錄返回0L os.path.abspath(name):獲得絕對(duì)路徑 os.path.normpath(path):規(guī)范path字符串形式 os.path.split(name):分割文件名與目錄(事實(shí)上,如果你完全使用目錄,它也會(huì)將最后一個(gè)目錄作為文件名而分離,同時(shí)它不會(huì)判斷文件或目錄是否存在) os.path.splitext():分離文件名與擴(kuò)展名 os.path.join(path,name):連接目錄與文件名或目錄 os.path.basename(path):返回文件名 os.path.dirname(path):返回文件路徑 os.remove(dir) #dir為要?jiǎng)h除的文件夾或者文件路徑 os.rmdir(path) #path要?jiǎng)h除的目錄的路徑。需要說明的是,使用os.rmdir刪除的目錄必須為空目錄,否則函數(shù)出錯(cuò)。 os.path.getmtime(name) #獲取文件的修改時(shí)間 os.stat(path).st_mtime#獲取文件的修改時(shí)間 os.stat(path).st_ctime #獲取文件修改時(shí)間 os.path.getctime(name)#獲取文件的創(chuàng)建時(shí)間
于是我照著這些方法,費(fèi)半天勁,終于寫出了“清理某路徑下所有文件及文件夾”的方法,代碼如下:
import os dirToBeEmptied = 'D:\_Data\Python\os' #需要清空的文件夾 ds = list(os.walk(dirToBeEmptied)) #獲得所有文件夾的信息列表 dsr = ds[::-1] #反轉(zhuǎn)該列表,從最底層的文件夾開始清算 for d in dsr: #遍歷該列表 print(d) #打印出列表項(xiàng),觀察規(guī)律 if d[2] != []: #如果該路徑下有文件 for x in d[2]: #先將文件清理干凈 os.remove(os.path.join(d[0], x)) for d in dsr: #再次遍歷該列表 if d[1] != []: #如果該路徑下有子文件夾 for y in d[1]: #將子文件夾清理干凈 os.rmdir(os.path.join(d[0], y))
之所以這么麻煩,是因?yàn)?os.rmdir() 有個(gè)毛病,只能刪除“空”文件夾。所以只能從最底層的文件夾開始清理,一級(jí)一級(jí)往上,才能清干凈。
后來想想,應(yīng)該有更簡便的方法,因?yàn)榍蹇瘴募A是很常見的動(dòng)作。查了Python官方文檔,發(fā)現(xiàn)了os以外的另一個(gè)模塊:shutil(高級(jí)文件操作),竟然有 shutil.rmtree() 的方法,不僅是清空,直接連文件夾都一起刪掉,太兇殘了!
為了“僅僅清空”,我搭配使用 shutil 模塊重寫了代碼:
import shutil, os os.chdir('d:\_data\python\os') #進(jìn)入要清空的目錄 ds = list(os.listdir()) #獲得該目錄下所有文件或文件夾列表 for d in ds: #遍歷該列表 if os.path.isfile(d): #如果列表項(xiàng)是文件 os.remove(d) #直接刪除 else: #如果不是文件,肯定是文件夾 shutil.rmtree(d) #也直接刪除
這下可就簡潔多了。
不過,清空一時(shí)爽,但已經(jīng)偏離我原來的目的了:我只是想刪除過期的文件,但文件夾和所有子文件夾都得留著啊。倒也不難,最開始的代碼中,第1次遍歷列表就是只刪文件、不刪文件夾。只要再加個(gè)判斷語句,判斷出文件是否過期,就能達(dá)到目的了。
我要?jiǎng)h除的文件,實(shí)際上是做鏡像備份時(shí),將已從主機(jī)刪除或更改的文件暫時(shí)保存下來,以備恢復(fù)之用。這些文件久了會(huì)越來越占空間,因此設(shè)定為1年過期。這些文件有一個(gè)特點(diǎn),就是只會(huì)被復(fù)制過來一次,且不會(huì)有任何修改,因此只需要判斷其創(chuàng)建日期就可以。
想著是容易,但萬萬沒想到,Python對(duì)時(shí)間的處理這么復(fù)雜!涉及到兩個(gè)模塊:datetime 和 time。有時(shí)間必須重頭系統(tǒng)學(xué)習(xí)一下,但這里,我只關(guān)心現(xiàn)在需要的幾個(gè)方法:
datetime.datetime.now() #獲取當(dāng)前時(shí)間,返回值的格式類似 datetime.datetime(2017, 12, 14, 1, 29, 24, 406538)
datetime.timedelta() #設(shè)定兩個(gè)時(shí)間之間的間隔,用于時(shí)間計(jì)算,可以設(shè)置的單位包括:(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0),默認(rèn)都為0
os.path.getctime() #獲取文件的創(chuàng)建時(shí)間,返回值的格式為一個(gè)巨大的浮點(diǎn)數(shù),為1970年1月1日到這個(gè)創(chuàng)建時(shí)間所歷經(jīng)的秒數(shù)
datetime.datetime.fromtimestamp() #將os.path.getctime() 轉(zhuǎn)換為跟datetime.datetime.now()一樣的格式,以進(jìn)行比較計(jì)算
弄清楚上面這些亂七八糟的之后,就可以寫代碼了:
import os, datetime dirToBeEmptied = 'D:\_Data\Python\os' #需要清空的文件夾 ds = list(os.walk(dirToBeEmptied)) #獲得所有文件夾的信息列表 delta = datetime.timedelta(days=365) #設(shè)定365天前的文件為過期 now = datetime.datetime.now() #獲取當(dāng)前時(shí)間 for d in ds: #遍歷該列表 os.chdir(d[0]) #進(jìn)入本級(jí)路徑,防止找不到文件而報(bào)錯(cuò) if d[2] != []: #如果該路徑下有文件 for x in d[2]: #遍歷這些文件 ctime = datetime.datetime.fromtimestamp(os.path.getctime(x)) #獲取文件創(chuàng)建時(shí)間 if ctime < (now-delta): #若創(chuàng)建于delta天前 os.remove(x) #則刪掉
呼~~~~~~~~~
真夠復(fù)雜的!不知道有沒有簡便一點(diǎn)的辦法……
以上這篇用Python刪除本地目錄下某一時(shí)間點(diǎn)之前創(chuàng)建的所有文件的實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 如何基于Python創(chuàng)建目錄文件夾
- python 模擬創(chuàng)建seafile 目錄操作示例
- Python腳本按照當(dāng)前日期創(chuàng)建多級(jí)目錄
- 解決python os.mkdir創(chuàng)建目錄失敗的問題
- Python實(shí)現(xiàn)按當(dāng)前日期(年、月、日)創(chuàng)建多級(jí)目錄的方法
- python實(shí)現(xiàn)一次創(chuàng)建多級(jí)目錄的方法
- python創(chuàng)建和刪除目錄的方法
- Python創(chuàng)建系統(tǒng)目錄的方法
- python判定文件目錄是否存在及創(chuàng)建多層目錄
相關(guān)文章
Pytest+Yaml+Excel?接口自動(dòng)化測試框架的實(shí)現(xiàn)示例
本文主要介紹了Pytest+Yaml+Excel?接口自動(dòng)化測試框架,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Python在Matplotlib圖中顯示中文字體的操作方法
這篇文章主要介紹了Python在Matplotlib圖中顯示中文字體的方法,本篇主要針對(duì)在Ubuntu系統(tǒng)中,matplotlib顯示不了中文的問題,尤其是在無法安裝系統(tǒng)字體的情況下,解決Python繪圖時(shí)中文顯示的問題。需要的朋友可以參考下2019-07-07Python實(shí)現(xiàn)隨機(jī)生成任意數(shù)量車牌號(hào)
這篇文章主要介紹了Python實(shí)現(xiàn)隨機(jī)生成任意數(shù)量車牌號(hào),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01對(duì)pytorch網(wǎng)絡(luò)層結(jié)構(gòu)的數(shù)組化詳解
今天小編就為大家分享一篇對(duì)pytorch網(wǎng)絡(luò)層結(jié)構(gòu)的數(shù)組化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python中Jieba進(jìn)行詞頻統(tǒng)計(jì)與關(guān)鍵詞提取
本文主要介紹了Python中Jieba進(jìn)行詞頻統(tǒng)計(jì)與關(guān)鍵詞提取,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03解決django中form表單設(shè)置action后無法回到原頁面的問題
這篇文章主要介紹了解決django中form表單設(shè)置action后無法回到原頁面的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03在python3.64中安裝pyinstaller庫的方法步驟
這篇文章主要介紹了在python3.64中安裝pyinstaller庫的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Python?pyecharts案例超市4年數(shù)據(jù)可視化分析
這篇文章主要介紹了Python?pyecharts案例超市4年數(shù)據(jù)可視化分析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08Python數(shù)據(jù)結(jié)構(gòu)與算法中的棧詳解
這篇文章主要為大家詳細(xì)介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法中的棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03