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


Posted in Python onDecember 14, 2017

因为工作原因,需要定期清理某个文件夹下面创建时间超过1年的所有文件,所以今天集中学习了一下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次遍历列表就是只删文件、不删文件夹。只要再加个判断语句,判断出文件是否过期,就能达到目的了。

我要删除的文件,实际上是做镜像备份时,将已从主机删除或更改的文件暂时保存下来,以备恢复之用。这些文件久了会越来越占空间,因此设定为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删除本地目录下某一时间点之前创建的所有文件的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python模块学习 re 正则表达式
May 19 Python
Python isinstance函数介绍
Apr 14 Python
Python基于win32ui模块创建弹出式菜单示例
May 09 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
python如何获取当前文件夹下所有文件名详解
Jan 25 Python
用python实现刷点击率的示例代码
Feb 21 Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 Python
Pyinstaller 打包exe教程及问题解决
Aug 16 Python
Python 实现顺序高斯消元法示例
Dec 09 Python
详解Python GUI编程之PyQt5入门到实战
Dec 10 Python
matplotlib bar()实现百分比堆积柱状图
Feb 24 Python
python中 .npy文件的读写操作实例
Apr 14 Python
python编程通过蒙特卡洛法计算定积分详解
Dec 13 #Python
Python编程产生非均匀随机数的几种方法代码分享
Dec 13 #Python
windows下Virtualenvwrapper安装教程
Dec 13 #Python
python实现机械分词之逆向最大匹配算法代码示例
Dec 13 #Python
Python语言描述KNN算法与Kd树
Dec 13 #Python
Python xlwt设置excel单元格字体及格式
Apr 18 #Python
Python语言实现百度语音识别API的使用实例
Dec 13 #Python
You might like
PHP文件上传原理简单分析
2011/05/29 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
2015/11/10 PHP
PHP获取访问页面HTTP状态码的实现代码
2016/11/03 PHP
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
图文详解vue框架安装步骤
2019/02/12 Javascript
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
Python批量更改文件名的实现方法
2017/10/29 Python
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
FitFlop美国官网:英国符合人体工学的鞋类品牌
2018/10/05 全球购物
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
联谊活动策划书
2014/01/26 职场文书
知识竞赛活动方案
2014/02/18 职场文书
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
高中语文教学反思范文
2016/02/16 职场文书
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏
vue自定义右键菜单之全局实现
2022/04/09 Vue.js