一、需求分析

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日志文件也会记录,和输出是一样的!

python 删除前3天的文件的更多相关文章

  1. Python2.7 删除前N天日志文件

    Python2.7 删除前N天日志文件 import os import sys import time day_n = 7 path=os.getcwd().replace("\\&quo ...

  2. 用Python删除本地目录下某一时间点之前创建的所有文件

    因为工作原因,需要定期清理某个文件夹下面创建时间超过1年的所有文件,所以今天集中学习了一下Python对于本地文件及文件夹的操作.网上 这篇文章 简明扼要地整理出最常见的os方法,抄袭如下: os.l ...

  3. 用Python删除本地目录下某一时间点之前创建的文件

    参考http://www.cnblogs.com/iderek/p/8035757.html os.listdir(dirname):列出dirname下的目录和文件 os.getcwd():获得当前 ...

  4. Python 删除文件与文件夹

    版权所有,未经许可,禁止转载 章节 Python 介绍 Python 开发环境搭建 Python 语法 Python 变量 Python 数值类型 Python 类型转换 Python 字符串(Str ...

  5. 使用python删除一个文件或文件夹

    使用python删除一个文件或文件夹,需要使用os模块. import osos.remove(path) # path是文件的路径,如果这个路径是一个文件夹,则会抛出OSError的错误,这时需用用 ...

  6. Linux系统下/tmp目录文件重启后自动删除,不重启自动删除10天前的/TMP的文件(转)

    /tmp目录文件重启后自动删除现在知道有ubuntu和solaris系统source:http://blog.chinaunix.net/uid-26212859-id-3567875.html经常会 ...

  7. 45、如何使用python删除一个文件?

    若想利用python删除windows里的文件,这里需要使用os模块!那接下来就看看利用os模块是如何删除文件的! 具体实现方法如下! os.remove(path) 删除文件 path. 如果pat ...

  8. python 删除重复文件 附源代码

    啥也不说了,直接上源码 #! /usr/bin/env python #coding=utf-8 import os import md5 import time def getmd5( filena ...

  9. linux系统下自动删除前N天的日志文件

    删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 实例命令: find /opt/soft/log/ -mti ...

随机推荐

  1. js子节点children和childnodes的用法

    想要获取子节点的数量,有几种办法. childNodes 它会把空的文本节点当成节点, <ul> 文本节点 <li>元素节点</li> 文本节点 <li> ...

  2. POI导入excel文件2

    POI上传到服务器读取excel文件1中已经介绍了上传文件和导入excel所有的内容http://www.cnblogs.com/fxwl/p/5896893.html , 本文中只是单单读取本地文件 ...

  3. c++设计模式之抽象工厂模式

    抽象工厂思想理解:可能有若干个你想生产的产品类,建立个工厂负责分别生产各类产品,由外部客户来选取想要那种产品类,此程序中没有delete,如想delete可在工厂类中的析构函数中实现(若有错请纠正)# ...

  4. Qt ------ QWidget 自定义子类使用信号与槽(Q_OBJECT)后 stylesheet 失效

    这个应该属于 Qt 的一个bug,Qt assistant 给出相应的解决办法:重写函数“void paintEvent(QPaintEvent *event);”,添加下面截图中的一段代码

  5. Java入门:读写文本文件

    文本文件的读写是学习java必须掌握的一项基本技术,因为在项目中时常会涉及到文本文件的读写. 一.使用FileWriter写文件 1.FileWriter类 [功能] FileWriter类专门用来写 ...

  6. ubunto 16.04 lts 源

    http://601502546.blog.163.com/blog/static/2596107620171502517889 国内有很多ubuntu的源,包括:网易源(这个之前用过,速度很快的), ...

  7. 利用ImageOps调整图片的Aspect Ratio(给图片添加borders)

    # -*- coding: utf-8 -*- #******************** # 改变图片的纵横比(aspect retio) # 使用ImageOps.expand() # Image ...

  8. P1978 集合

    P1978 集合 题目描述 集合是数学中的一个概念,用通俗的话来讲就是:一大堆数在一起就构成了集合.集合有如 下的特性: •无序性:任一个集合中,每个元素的地位都是相同的,元素之间是无序的. •互异性 ...

  9. Java基础-方法(method)的应用

    Java基础-方法(method)的应用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 方法就是定义在类中,具有特定功能的一段小程序,方法也称为函数(function),方法可以接 ...

  10. React.js基础入门

    本文主要是针对React的一些demo教程.参考了菜鸟教程中的react教程,做了一些总结.Demo的下载链接是 https://github.com/RealAndMe/react-demo 下面要 ...