检查目录模式Python

时间:2016-11-15 13:58:29

标签: python

我有一个由具有基本结构的应用程序创建的目录。

G009832
   - SearchData
         _SearchDb_
         _SearchDb_.dbsync
   - WaveformCache
         file1.wcf
         file2.wcf
   ProjectNameFile.apf
   ProjectNameSettings.xml
   ProjectNameSettingsBinary.abf

此文件夹和文件结构非常不变,唯一的变量是根文件夹名称,即机器名称,以及WaveformCache文件夹中存在的* .wcf波形缓存文件的数量。

我想在删除之前检查用户是否在任何这些文件夹或任何子文件夹中都没有添加任何额外内容。

目前我正在用os.walk检查每个文件夹的内容。

illegal = []
if IsMachineFormatted(folder): # Function that checks folder is machine folder.
    for root, dirs, files in os.walk(folder):
        for f in files:
            if f == '_SearchDb_':
                pass
            elif f == '_SearchDb_.dbsync':
                pass
            elif f.endswith('.wcf'):
                pass
            elif f.endswith('.apf'):
                pass
            elif f.endswith('.xml'):
                pass
            elif f.endswith('.abf'):
                pass
            else:
                illegal.append(f)
else:
    pass   

这没关系并返回非法文件列表,但它不是很优雅,也不检查额外的目录等。它还允许任意数量的.xml或任何其他允许类型的文件通过。

在我开始改进此代码之前,我非常确定有更好的方法可以做到这一点。

我不知道python目录的比较运算符,我很乐意返回类似于字典列表的内容,其中包含已添加到默认目录模式的任何额外文件和文件夹的结构。例如

difference = [{'FolderName':['Naughty.txt','illegal.etc'],{'Disobedience':['Here.txt','AndHere.txt']}]

1 个答案:

答案 0 :(得分:0)

我刚刚重写了你的代码。使用any可以更优雅,但效果较差(因为它需要检查所有目的)。 我不确定我是否正确地提出了关于error的问题,因为您使用了错误的语法。

另外,我建议您将此代码分解为函数以避免5个步骤嵌套:

from collections import defaultdict

ALLOWED_NAMES = ['_SearchDb_', '_SearchDb_.dbsync']
ALLOWED_ENDS = ['.wcf', '.apf', '.xml', '.abf']

def ends_with_any(word, ends):
    for end in ends:
        if word.endswith(end):
            return True
    return False

def is_legal_name(filename, allowed_names, allowed_ends):
    return filename in allowed_names or ends_with_any(f, allowed_ends)

illegal = defaultdict(list)
if IsMachineFormatted(folder): # Function that checks folder is machine folder.
    for dirpath, dirs, files in os.walk(folder):
        for f in files:
            if not is_legal_name(f, ALLOWED_NAMES, ALLOWED_ENDS):
                illegal[dirpath].append(f)