在Python中删除具有不同名称的文件

时间:2014-01-03 23:30:41

标签: python glob

我正在尝试删除目录中的多个文件。

到目前为止,我有那段代码:

   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)

有没有办法提高效率呢?

2 个答案:

答案 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次。

幸运的是,几乎在任何平台上,它可能最终都会在第一次被缓存之后。除非你的目录绝对是巨大的,否则这不会是一个明显的问题。

但是既然你明确询问了效率,你可以显然迭代一次并过滤结果。最简单的方法是使用fnmatchglob正在做的就是在每个结果上调用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时间相比可能是如此之小,甚至无法衡量改进。