欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

用Python刪除本地目錄下某一時(shí)間點(diǎn)之前創(chuàng)建的所有文件的實(shí)例

 更新時(shí)間:2017年12月14日 08:28:19   作者:木木卡卡西  
下面小編就為大家分享一篇用Python刪除本地目錄下某一時(shí)間點(diǎn)之前創(chuàng)建的所有文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

因?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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論