python 刪除前3天的文件


一、需求分析

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天日期的時間戳格式
View Code

 

執行輸出:

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天,無需處理!")
View Code

 

執行輸出:

當前日期 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)
View Code

 

執行輸出:

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日志文件也會記錄,和輸出是一樣的!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM