用Python刪除本地目錄下某一時間點之前建立的所有檔案的例項

NO IMAGE

因為工作原因,需要定期清理某個資料夾下面建立時間超過1年的所有檔案,所以今天集中學習了一下Python對於本地檔案及資料夾的操作。網上 這篇文章 簡明扼要地整理出最常見的os方法,抄襲如下:


os.listdir(dirname):列出dirname下的目錄和檔案
os.getcwd():獲得當前工作目錄
os.curdir:返回當前目錄('.')
os.chdir(dirname):改變工作目錄到dirname
os.path.isdir(name):判斷name是不是一個目錄,name不是目錄就返回false
os.path.isfile(name):判斷name是不是一個檔案,不存在name也返回false
os.path.exists(name):判斷是否存在檔案或目錄name
os.path.getsize(name):獲得檔案大小,如果name是目錄返回0L
os.path.abspath(name):獲得絕對路徑
os.path.normpath(path):規範path字串形式
os.path.split(name):分割檔名與目錄(事實上,如果你完全使用目錄,它也會將最後一個目錄作為檔名而分離,同時它不會判斷檔案或目錄是否存在)
os.path.splitext():分離檔名與副檔名
os.path.join(path,name):連線目錄與檔名或目錄
os.path.basename(path):返回檔名
os.path.dirname(path):返回檔案路徑
os.remove(dir) #dir為要刪除的資料夾或者檔案路徑
os.rmdir(path) #path要刪除的目錄的路徑。需要說明的是,使用os.rmdir刪除的目錄必須為空目錄,否則函式出錯。
os.path.getmtime(name) #獲取檔案的修改時間
os.stat(path).st_mtime#獲取檔案的修改時間
os.stat(path).st_ctime #獲取檔案修改時間
os.path.getctime(name)#獲取檔案的建立時間

於是我照著這些方法,費半天勁,終於寫出了“清理某路徑下所有檔案及資料夾”的方法,程式碼如下:


import os
dirToBeEmptied = 'D:\_Data\Python\os' #需要清空的資料夾
ds = list(os.walk(dirToBeEmptied)) #獲得所有資料夾的資訊列表
dsr = ds[::-1] #反轉該列表,從最底層的資料夾開始清算
for d in dsr: #遍歷該列表
print(d) #列印出列表項,觀察規律
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))

之所以這麼麻煩,是因為 os.rmdir() 有個毛病,只能刪除“空”資料夾。所以只能從最底層的資料夾開始清理,一級一級往上,才能清乾淨。

後來想想,應該有更簡便的方法,因為清空資料夾是很常見的動作。查了Python官方文件,發現了os以外的另一個模組:shutil(高階檔案操作),竟然有 shutil.rmtree() 的方法,不僅是清空,直接連資料夾都一起刪掉,太凶殘了!

為了“僅僅清空”,我搭配使用 shutil 模組重寫了程式碼:


import shutil, os
os.chdir('d:\_data\python\os') #進入要清空的目錄
ds = list(os.listdir()) #獲得該目錄下所有檔案或資料夾列表
for d in ds: #遍歷該列表
if os.path.isfile(d): #如果列表項是檔案
os.remove(d) #直接刪除
else: #如果不是檔案,肯定是資料夾
shutil.rmtree(d) #也直接刪除

這下可就簡潔多了。

不過,清空一時爽,但已經偏離我原來的目的了:我只是想刪除過期的檔案,但資料夾和所有子資料夾都得留著啊。倒也不難,最開始的程式碼中,第1次遍歷列表就是隻刪檔案、不刪資料夾。只要再加個判斷語句,判斷出檔案是否過期,就能達到目的了。

我要刪除的檔案,實際上是做映象備份時,將已從主機刪除或更改的檔案暫時儲存下來,以備恢復之用。這些檔案久了會越來越佔空間,因此設定為1年過期。這些檔案有一個特點,就是隻會被複制過來一次,且不會有任何修改,因此只需要判斷其建立日期就可以。

想著是容易,但萬萬沒想到,Python對時間的處理這麼複雜!涉及到兩個模組:datetime 和 time。有時間必須重頭系統學習一下,但這裡,我只關心現在需要的幾個方法:

datetime.datetime.now() #獲取當前時間,返回值的格式類似 datetime.datetime(2017, 12, 14, 1, 29, 24, 406538)

datetime.timedelta() #設定兩個時間之間的間隔,用於時間計算,可以設定的單位包括:(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0),預設都為0

os.path.getctime() #獲取檔案的建立時間,返回值的格式為一個巨大的浮點數,為1970年1月1日到這個建立時間所歷經的秒數

datetime.datetime.fromtimestamp() #將os.path.getctime() 轉換為跟datetime.datetime.now()一樣的格式,以進行比較計算

弄清楚上面這些亂七八糟的之後,就可以寫程式碼了:


import os, datetime
dirToBeEmptied = 'D:\_Data\Python\os' #需要清空的資料夾
ds = list(os.walk(dirToBeEmptied)) #獲得所有資料夾的資訊列表
delta = datetime.timedelta(days=365) #設定365天前的檔案為過期
now = datetime.datetime.now() #獲取當前時間
for d in ds: #遍歷該列表
os.chdir(d[0]) #進入本級路徑,防止找不到檔案而報錯
if d[2] != []: #如果該路徑下有檔案
for x in d[2]: #遍歷這些檔案
ctime = datetime.datetime.fromtimestamp(os.path.getctime(x)) #獲取檔案建立時間
if ctime < (now-delta): #若建立於delta天前
os.remove(x) #則刪掉

呼~~~~~~~~~

真夠複雜的!不知道有沒有簡便一點的辦法……

以上這篇用Python刪除本地目錄下某一時間點之前建立的所有檔案的例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援指令碼之家。

您可能感興趣的文章:

Python程式設計實現輸入某年某月某日計算出這一天是該年第幾天的方法python 計算兩個日期相差多少個月例項程式碼Python根據指定日期計算後n天,前n天是哪一天的方法Python計算兩個日期相差天數的方法示例Python實現計算兩個時間之間相差天數的方法python計算N天之後日期的方法python中關於時間和日期函式的常用計算總結(time和datatime)Python計算一個給定時間點前一個月和後一個月第一天的方法