因为工作原因,需要定期清理某个文件夹下面创建时间超过 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 。有时间必须重头系统学习一下,但这里,我只关心现在需要的几个方法:
弄清楚上面这些乱七八糟的之后,就可以写代码了:
- 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) #则删掉
呼~~~~~~~~~
真够复杂的!不知道有没有简便一点的办法……
来源: http://www.cnblogs.com/iderek/p/8035757.html