2016-11-15 49 views
0

我有具有基本結構的應用程序創建的目錄。檢查目錄模式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

回答

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) 
+0

謝謝瓦倫丁。我改變了函數def - 而f不傳遞給is_legal_name - 它是'文件名',但它的工作原理,比我所做的要好。 – Xeberdee

+0

哦,對不起 - 最近JS太多了:-)編輯。 –

+0

我將「錯誤」更改爲「差異」,使問題讀得更好。我正在考慮有效和無效結構之間的差異是錯誤的。 – Xeberdee