因为工作原因,需要定期清理某个文件夹下面创建时间超过1年的所有文件,所以今天集中学习了一下Python对于本地文件及文件夹的操作。网上 这篇文章 简明扼要地整理出最常见的os方法,抄袭如下:
os.listdir(dirname):列出dirname下的目录和文件os.getcwd():获得当前工作目录os.curdir:返回当前目录('.')os.chdir(dirname):改变工作目录到dirnameos.path.isdir(name):判断name是不是一个目录,name不是目录就返回falseos.path.isfile(name):判断name是不是一个文件,不存在name也返回falseos.path.exists(name):判断是否存在文件或目录nameos.path.getsize(name):获得文件大小,如果name是目录返回0Los.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 osdirToBeEmptied = '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, osos.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) #也直接删除
新闻热点
疑难解答