一、需求分析
1. 刪除前3天的文件
2.如果目錄為空,也一並刪除掉
如果使用shell腳本,一條命令就搞定了。干啥還要用python?
1. 因為需要記錄一些日志,使用shell不好實現
2. 作為一名python開發,能用python實現,豈不增長你的技術,不是嗎?
二、相關知識點
1. 獲取文件修改時間
在os模塊中,有一個方法os.path.getmtime(),可以獲取文件修改時間。
例如:
import os ret = os.path.getmtime('test.docx') print(ret)
執行輸出:
1542704403.1820524
它的返回結果是一個時間戳
2. 獲取前3天時間
在time模塊中,不好實現獲取前3天的時間。但是datetime模塊是可以的!
import datetime # 獲取當前時間 today = datetime.datetime.now() # 計算偏移量,前3天 offset = datetime.timedelta(days=-3) # 獲取想要的日期的時間,即前3天時間 re_date = (today + offset) print(today.strftime('%Y-%m-%d')) # 當前日期 print(re_date.strftime('%Y-%m-%d')) # 前3天日期
執行輸出:
2018-11-21 2018-11-18
時間比較
那么問題來了,上面的文件修改時間是一個時間戳格式。而這里是日期,如何比較?
只要格式統一就可以了,將日期轉換為時間戳,使用time.mktime()方法

import time import datetime # 獲取當前時間 today = datetime.datetime.now() # 計算偏移量,前3天 offset = datetime.timedelta(days=-3) # 獲取想要的日期的時間,即前3天時間 re_date = (today + offset) # 前3天時間轉換為時間戳 re_date_unix = time.mktime(re_date.timetuple()) # print(today.strftime('%Y-%m-%d')) # 當前日期 # print(re_date.strftime('%Y-%m-%d')) # 前3天日期 print(re_date_unix) # 前3天日期的時間戳格式
執行輸出:
1542523307.0
開始正式比較,test.docx的文件時間是否需要刪除

#!/usr/bin/env python # coding: utf-8 import os import time import datetime # 獲取當前時間 today = datetime.datetime.now() # 計算偏移量,前3天 offset = datetime.timedelta(days=-3) # 獲取想要的日期的時間,即前3天時間 re_date = (today + offset) # 前3天時間轉換為時間戳 re_date_unix = time.mktime(re_date.timetuple()) print("當前日期",today.strftime('%Y-%m-%d')) # 當前日期 print("前3天日期",re_date.strftime('%Y-%m-%d')) # 前3天日期 file_time = os.path.getmtime('test.docx') # 文件修改時間 timeArray = time.localtime(file_time) # 時間戳->結構化時間 otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray) #格式化時間 print("文件修改時間",otherStyleTime) if file_time <= re_date_unix: print("已經超過3天,需要刪除") else: print("未超過3天,無需處理!")
執行輸出:
當前日期 2018-11-21 前3天日期 2018-11-18 文件修改時間 2018-11-20 17:00:03 未超過3天,無需處理!
3. 空目錄一並刪除
怎么說呢?如果是一個空目錄,就刪除。如果它的上一級還是空目錄,也要刪除!依次類推!
在os模塊中,有一個os.removedirs()方法,可以實現這個功能!
若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推。
舉例:
import os os.removedirs('a')
4. 遍歷目錄,使用棧
這里的遍歷目錄,可不是只有一層。有多少層呢?我也不知道!只要目錄下面有,就遍歷!
到了這里,你可能會想到遞歸。但是遞歸這個東西,不是一般人能夠理解的。所以我使用棧,這個比較好理解!
在之前的文章中,已經用棧實現了,統計目錄占用多少空間。需要將每一個文件大小進行累加計算,請參考鏈接:
https://www.cnblogs.com/xiao987334176/p/8954715.html
還有一個小的知識點,就是日志模塊,也就是logging模塊,請參考鏈接:
https://www.cnblogs.com/xiao987334176/p/8920181.html#autoid-0-2-0
三、正式腳本
這個腳本,是參考了上面鏈接中的 使用棧統計目錄大小。
在這個基礎上做了一些小修改,完整代碼如下:

#!/usr/bin/env python3 # coding: utf-8 import os import time import datetime import logging class DeleteFile(object): def __init__(self,path): self.path = path def logger(self): """ 寫入日志 :return: logger對象 """ logger = logging.getLogger() # 實例化了一個logger對象 # 在國外叫handler,在中國翻譯過來,叫句柄 # 設置文件名和編碼 fh = logging.FileHandler('delete.log', encoding='utf-8') # 實例化了一個文件句柄 # 格式和文件句柄或者屏幕句柄關聯 sh = logging.StreamHandler() # 用於輸出到控制台 fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 格式化 fh.setFormatter(fmt) # 格式和文件句柄或者屏幕句柄關聯 sh.setFormatter(fmt) # 吸星大法 logger.addHandler(fh) # 吸收寫文件功能 和logger關聯的只有句柄 logger.addHandler(sh) # 吸收輸出屏幕功能 logger.setLevel(logging.DEBUG) # 設置警告級別為debug,此處DEBUG源碼為DEBUG = 10 # logger.debug('debug message') # logger.info('info message') # logger.warning('warning message') return logger def delete(self): """ 刪除文件 :param path: 文件路徑 :return: bool """ file_list = [self.path] # 文件夾列表 # 獲取當前時間 today = datetime.datetime.now() # 計算偏移量,前3天 offset = datetime.timedelta(days=-3) # 獲取想要的日期的時間,即前3天時間 re_date = (today + offset) # 前3天時間轉換為時間戳 re_date_unix = time.mktime(re_date.timetuple()) try: while file_list: # 判斷列表是否為空 path = file_list.pop() # 刪除列表最后一個元素,並返回給path l = ['E:\python_script\day26'] for item in os.listdir(path): # 遍歷列表,path = 'E:\python_script\day26' path2 = os.path.join(path, item) # 組合絕對路徑 path2 = 'E:\python_script\day26\test' if os.path.isfile(path2): # 判斷絕對路徑是否為文件 # 比較時間戳,文件修改時間小於等於3天前 if os.path.getmtime(path2) <= re_date_unix: os.remove(path2) self.logger().debug('刪除文件{}'.format(path2)) # 寫入日志 else: if not os.listdir(path2): # 判斷目錄是否為空 # 若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推 os.removedirs(path2) self.logger().debug('刪除空目錄{}'.format(path2)) # 寫入日志 else: # 為文件夾時,添加到列表中。再次循環。l = ['E:\python_script\day26\test'] file_list.append(path2) return True except Exception as e: print(e) return False ret = DeleteFile('./').delete() # 當前目錄 print(ret)
執行輸出:
2018-11-20 11:44:43,254 - root - DEBUG - 刪除文件./delpods.sh 2018-11-20 13:53:14,403 - root - DEBUG - 刪除空目錄./新建文件夾 2018-11-20 13:53:43,406 - root - DEBUG - 刪除空目錄./a\b\c
與此同時,delete.log日志文件也會記錄,和輸出是一樣的!