因為工作原因,需要定期清理某個文件夾下面創建時間超過1年的所有文件,所以今天集中學習了一下Python對于本地文件及文件夾的操作。網上 這篇文章 簡明扼要地整理出最常見的os方法,抄襲如下:
os.listdir(dirname):列出dirname下的目錄和文件os.getcwd():獲得當前工作目錄os.curdir:返回當前目錄('.')os.chdir(dirname):改變工作目錄到dirnameos.path.isdir(name):判斷name是不是一個目錄,name不是目錄就返回falseos.path.isfile(name):判斷name是不是一個文件,不存在name也返回falseos.path.exists(name):判斷是否存在文件或目錄nameos.path.getsize(name):獲得文件大小,如果name是目錄返回0Los.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 osdirToBeEmptied = '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, osos.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) #也直接刪除
新聞熱點
疑難解答