Python实现删除指定目录下过期文件的两种方法
本文介绍使用Python定期清理本地目录下创建时间超过一年的文件。首先通过os模块遍历目录手动删除,随后利用shutil模块简化操作。重点讲解如何结合datetime和os.path.getctime判断文件创建时间,实现仅删除过期文件而保留文件夹结构的自动化脚本。
由于工作需求,需要定期清理特定文件夹中创建时间超过一年的所有文件,因此今天重点研究了Python对本地文件和文件夹的操作。网上有一篇文章简明扼要地整理了最常见的os方法,内容如下:
os.listdir(dirname):列出dirname下的目录和文件 os.getcwd():获得当前工作目录 os.curdir:返回当前目录('.') os.chdir(dirname):改变工作目录到dirname os.path.isdir(name):判断name是不是一个目录,name不是目录就返回false os.path.isfile(name):判断name是不是一个文件,不存在name也返回false os.path.exists(name):判断是否存在文件或目录name os.path.getsize(name):获得文件大小,如果name是目录返回0L os.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 os dirToBeEmptied = '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, os
os.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) #也直接删除
这样代码变得简洁了许多。
然而,虽然清空操作很顺畅,但这偏离了最初的目的:我只希望删除过期的文件,同时保留文件夹及其所有子文件夹结构。这并不复杂,在最初的代码中,第一次遍历列表时只删除文件而不删除文件夹。只需增加一个判断语句,检查文件是否过期,即可达成目标。
需要删除的文件实际上是镜像备份过程中,将主机上已删除或更改的文件暂时保存下来,以备恢复之用。随着时间推移,这些文件会占用大量空间,因此设定为1年过期。这些文件有一个特点:只会被复制一次,且后续不会有任何修改,因此只需判断其创建日期即可。
思路虽清晰,但Python对时间的处理却相当复杂!这涉及两个模块:datetime和time。虽然有时间需要从头系统学习,但这里只关注当前所需的几个方法:
datetime.datetime.now() #获取当前时间,返回值格式类似 datetime.datetime(2017, 12, 14, 1, 29, 24, 406538)
datetime.timedelta() #设定两个时间之间的间隔,用于时间计算,可设置的单位包括:(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0),默认值均为0
os.path.getctime() #获取文件的创建时间,返回值是一个巨大的浮点数,表示从1970年1月1日到该创建时间所经历的秒数
datetime.datetime.fromtimestamp() #将os.path.getctime()的结果转换为与datetime.datetime.now()相同的格式,以便进行比较计算
理清上述方法后,即可编写最终代码:
import os, datetime
dirToBeEmptied = 'D:\_Data\Python\os' #需要清空的文件夹
ds = list(os.walk(dirToBeEmptied)) #获得所有文件夹的信息列表
delta = datetime.timedelta(days=365) #设定365天前的文件为过期
now = datetime.datetime.now() #获取当前时间
for d in ds: #遍历该列表
os.chdir(d[0]) #进入本级路径,防止找不到文件而报错
if d[2] != []: #如果该路径下有文件
for x in d[2]: #遍历这些文件
ctime = datetime.datetime.fromtimestamp(os.path.getctime(x)) #获取文件创建时间
if ctime < (now-delta): #若创建于delta天前
os.remove(x) #则删掉
呼~~~~~~~~~
确实相当复杂!不知道是否有更简便的办法……
以上关于使用Python删除本地目录下某一时间点之前创建的所有文件的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









