检查目录模式Python

问题描述:

我有具有基本结构的应用程序创建的目录。检查目录模式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']}] 
+0

我会通过读取目录结构(或它的表示)到数据结构开始。为你的有效目录结构创建一个类似的数据结构,然后你的问题归结为一个非常简单的函数,该函数比较来自两棵不同树的节点并在子节点上递归。 – thebjorn

+0

我可以做到这一点,但它似乎很详细。我正在考虑更多的一行 - 对于root,dir,os.walk(path)中的文件:如果dir或文件不在模式中:返回错误 - 但是我在某些目录中有可变数量的文件。 – Xeberdee

+0

我认为它不会比现有的解决方案复杂得多,而且更灵活。另一个想法可能是生成目录结构的多行字符串版本和有效结构,然后使用difflib生成diff。 – thebjorn

我刚刚重写了一下你的代码。它可以更优雅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) 
+0

谢谢瓦伦丁。我改变了函数def - 而f不传递给is_legal_name - 它是'文件名',但它的工作原理,比我所做的要好。 – Xeberdee

+0

哦,对不起 - 最近JS太多了:-)编辑。 –

+0

我将“错误”更改为“差异”,使问题读得更好。我正在考虑有效和无效结构之间的差异是错误的。 – Xeberdee