搜索文件夹和删除文件(如果它们存在于列表中)的最佳方法?

时间:2016-12-20 00:04:23

标签: python python-2.7 list python-3.x

我已经创建了一个列表,其中包含我要删除的文件的文件路径。什么是搜索文件夹的最Pythonic方式,以及这些文件的子文件夹,然后删除它们?

目前,我循环浏览文件路径列表,然后浏览目录并将目录中的文件与列表中的文件进行比较。必须有更好的方法。

for x in features_to_delete:

    name_checker = str(x) + '.jpg'
    print 'this is name checker {}'.format(name_checker)

    for root, dir2, files in os.walk(folder):
        print 'This is the root directory at the moment:{} The following are files inside of it'.format(root)

        for b in files:
            if b.endswith('.jpg'):
                local_folder = os.path.join(folder, root)
                print 'Here is name of file {}'.format(b)
                print 'Here is name of name checker {}'.format(name_checker)

                if b == name_checker:
                    counter += 1
                    print '{} needs to be deleted..'.format(b)
                    #os.remove(os.path.join(local_folder, b))
                    print 'Removed {} \n'.format(os.path.join(day_folder, b))

                else:
                    print 'This file can stay {} \n'.format(b)
            else:
                pass

因此,为了澄清,我现在正在做的是循环遍历要删除的整个功能列表,每次迭代我都会循环遍历目录和所有子目录中的每个文件并比较该文件到当前正在要删除的功能列表中循环的文件。它需要很长时间,似乎是一种可怕的方式去做。

3 个答案:

答案 0 :(得分:0)

您应该只访问每个目录一次。您可以使用集合将给定目录中的文件名列表与删除列表进行比较。包含和不包含文件的列表变为简单的一步操作。如果你不关心打印出文件名,那就相当紧凑了:

delete_set = set(str(x) + '.jpg' for x in features_to_delete)
for root, dirs, files in os.walk(folder):
    for delete_name in delete_set.intersection(files):
        os.remove(os.path.join(root, delete_name))

但是如果你想要随意打印,你必须添加一些中间变量

delete_set = set(str(x) + '.jpg' for x in features_to_delete)
for root, dirs, files in os.walk(folder):
    files = set(files)
    delete_these = delete_set & files
    keep_these = files - delete_set
    print 'This is the root directory at the moment:{} The following are files inside of it'.format(root)
    print 'delete these: {}'.format('\n '.join(delete_these))
    print 'keep these: {}'.format('\n '.join(keep_these))
    for delete_name in delete_these:
        os.remove(os.path.join(root, delete_name))

答案 1 :(得分:0)

创建一个函数,将递归的glob类功能与您自己的删除逻辑分开。然后只需遍历列表并删除任何与黑名单匹配的内容。

您可以使set提供与文件名匹配的改进性能。列表越大,改进越大,但对于较小的列表,它可能可以忽略不计。

from fnmatch import fnmatch
import os
from os import path

def globber(rootpath, wildcard):
    for root, dirs, files in os.walk(rootpath):
        for file in files:
            if fnmatch(file, wildcard):
                yield path.join(root, file)

features_to_delete = ['blah', 'oh', 'xyz']

todelete = {'%s.jpg' % x for x in features_to_delete}

print(todelete)
for f in globber('/home/prooney', "*.jpg"):
    if f in todelete:
        print('deleting file: %s' % f)
        os.remove(f)

答案 2 :(得分:0)

请查看此代码是否对您有所帮助。我包括一个计时器,用于比较两种不同方法的时间。

T0

测试

string