我有具有基本結構的應用程序創建的目錄。檢查目錄模式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']}]
我會通過讀取目錄結構(或它的表示)到數據結構開始。爲你的有效目錄結構創建一個類似的數據結構,然後你的問題歸結爲一個非常簡單的函數,該函數比較來自兩棵不同樹的節點並在子節點上遞歸。 – thebjorn
我可以做到這一點,但它似乎很詳細。我正在考慮更多的一行 - 對於root,dir,os.walk(path)中的文件:如果dir或文件不在模式中:返回錯誤 - 但是我在某些目錄中有可變數量的文件。 – Xeberdee
我認爲它不會比現有的解決方案複雜得多,而且更靈活。另一個想法可能是生成目錄結構的多行字符串版本和有效結構,然後使用difflib生成diff。 – thebjorn