我正在尝试删除目录中的多个文件。
到目前为止,我有那段代码:
for filename in glob.glob("buffer*" ):
os.remove(filename)
for filename in glob.glob("grid*" ):
os.remove(filename)
for filename in glob.glob("OSMroads*" ):
os.remove(filename)
for filename in glob.glob("newCostSurface*" ):
os.remove(filename)
for filename in glob.glob("standsLine*" ):
os.remove(filename)
for filename in glob.glob("standsReprojected*" ):
os.remove(filename)
有没有办法提高效率呢?
答案 0 :(得分:4)
我喜欢使用列表,所以我不重复代码,如下所示:
for pattern in ['buffer*','grid*','OSMroads*','newCostSurface*','standsLine*'
'standsReprojected*']:
for filename in glob.glob(pattern):
os.remove(filename)
答案 1 :(得分:4)
执行6次单独的glob
调用当然会迭代目录对象6次。
幸运的是,几乎在任何平台上,它可能最终都会在第一次被缓存之后。除非你的目录绝对是巨大的,否则这不会是一个明显的问题。
但是既然你明确询问了效率,你可以显然迭代一次并过滤结果。最简单的方法是使用fnmatch
。 glob
正在做的就是在每个结果上调用listdir
然后调用fnmatch
;你可以通过多个fnmatch
来电做同样的事情:
for filename in os.listdir('.'):
if fnmatch.fnmatch(filename, 'buffer*'):
os.remove(filename)
# etc.
当然,您可以使用简化现有代码的方式完全简化:
for filename in os.listdir('.'):
for pattern in ['buffer*', 'grid*', 'OSMroads*',
'newCostSurface*','standsLine*', 'standsReprojected*']:
if fnmatch.fnmatch(filename, pattern):
os.remove(filename)
或者:
for filename in os.listdir('.'):
if any(fnmatch.fnmatch(filename, pattern)
for pattern in ['buffer*', 'grid*', 'OSMroads*',
'newCostSurface*','standsLine*', 'standsReprojected*']):
os.remove(filename)
如果你真的需要挤出另一小部分性能,你可以使用fnmatch.translate
将每个模式转换为正则表达式,然后将正则表达式合并为一个替换,然后编译它,然后应用它regexp对象到每个文件名。但是fnmatch
的CPU时间与读取目录对象的I / O时间相比可能是如此之小,甚至无法衡量改进。