用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 将字符串转换成字典dict
Mar 24 Python
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
Python实现计算文件夹下.h和.cpp文件的总行数
Apr 23 Python
Python使用Scrapy保存控制台信息到文本解析
Dec 27 Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 Python
flask-restful使用总结
Dec 04 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
Dec 21 Python
pytorch中获取模型input/output shape实例
Dec 30 Python
基于Tensorflow使用CPU而不用GPU问题的解决
Feb 07 Python
python 子类调用父类的构造函数实例
Mar 12 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 Python
Python获取android设备cpu和内存占用情况
Nov 15 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备份/还原MySQL数据库的代码
2011/01/06 PHP
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
PHP高级对象构建 工厂模式的使用
2012/02/05 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
PHP使用静态方法的几个注意事项
2014/09/16 PHP
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
28个JS验证函数收集
2010/03/02 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
jQuery 利用ztree实现树形表格的实例代码
2017/09/27 jQuery
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
Vue+Bootstrap实现简易学生管理系统
2021/02/09 Vue.js
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
Python视频爬虫实现下载头条视频功能示例
2018/05/07 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
对Python3中dict.keys()转换成list类型的方法详解
2019/02/03 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
实习单位接收函
2014/01/11 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
思想道德自我评价2015
2015/03/09 职场文书
校运会通讯稿
2015/07/18 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
python实现简单的名片管理系统
2021/04/26 Python
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技