因为工作原因,需要定期清理某个文件夹下面创建时间超过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删除本地目录下某一时间点之前创建的所有文件的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]