[英]Parse all files in a folder except ones being typed in an XML file, using Python
新手程序員,適合您的Python環境。
我有的:
我打算做什么:
到目前為止,我的代碼如下所示:
<?xml version="1.0"?>
<Modules>
<Module>
<Name>MOD_Test1</Name>
<Shortname>1</Shortname>
<ExcludeList>
<File>HeaderFile.h</File>
<File>CFile.c</File>
</ExcludeList>
</Module>
<Module>
<Name>MOD_Test2</Name>
<Shortname>2</Shortname>
<ExcludeList>
<File>TextFile.txt</File>
</ExcludeList>
</Module>
</Modules>
那顯然是XML文件
def GetExceptFiles(ListOfExceptFiles = []):
tree = ET.ElementTree(file='Config.xml')
Modules = tree.getroot()
for Module in Modules:
for Attribute in Module:
if Attribute.tag=='Name':
ModuleName = Attribute.text
if Attribute.tag=='Shortname':
ModuleShortName = Attribute.text
for File in Attribute:
ExceptFileName = File.text
print ('In module {} we must exclude {}'.format(ModuleName, ExceptFileName))
if ExceptFileName is not None:
ListOfExceptFiles.append(ExceptFileName)
這將讀取XML文件,並為我提供必須排除的文件列表。 這可以完成工作,但是效果很差。 假設兩個模塊的文件名完全相同,一個文件被排除,另一個文件沒有。 它們都將被跳過。
def Parse(walk_dir):
print('walk_dir = ' + walk_dir)
for root, subdirs, files in os.walk(walk_dir):
print('-------------------------------------------------------\nroot = ' + root)
for filename in files:
with open(os.path.join(root, filename), 'r') as src:
Text = src.read()
print ('\nFile %s contains: \n' %filename) + Text
現在開始解析,這就是我開始的內容。 我知道它不會解析,但是一旦我可以讀取文件的內容,那么我當然也可以做其他事情。
至於刪除例外文件部分,我所做的就是在第二個FOR中添加IF語句
for filename in files:
if filename not in ListOfExceptFile:
with open(os.path.join(root, filename), 'r') as src:
這是它做對的兩件事:
編輯:@ bracco23的答案讓我開始思考,盡管我沒有成功映射以模塊名稱為鍵的多個列表(如果可以的話,仍在尋求幫助)
這是我從列表列表的想法開始的:
def ReadConfig(Tuples = []):
tree = ET.ElementTree(file='Config.xml')
Modules = tree.getroot()
for Module in Modules:
for Attribute in Module:
if Attribute.tag=='Name':
ModuleName = Attribute.text
for File in Attribute:
ExceptFileName = File.text
Tuple = (ModuleName, ExceptFileName)
Tuples.append(Tuple)
這是一種好方法嗎?
這項工作相當不錯,這里僅列出了一些微不足道的調整措施,以解決這些問題:
1)在GetExceptFiles(ListOfExceptFiles = [])
,將文件添加到for over Attribute
末尾的列表中。 這導致僅添加最后一個文件的事實。 在將檢查移到文件上方時,應將所有排除的文件添加到列表中。 (幾個選項卡/空格就足夠了)
def GetExceptFiles(ListOfExceptFiles = []):
tree = ET.ElementTree(file='Config.xml')
Modules = tree.getroot()
for Module in Modules:
for Attribute in Module:
if Attribute.tag=='Name':
ModuleName = Attribute.text
if Attribute.tag=='Shortname':
ModuleShortName = Attribute.text
for File in Attribute:
ExceptFileName = File.text
print ('In module {} we must exclude {}'.format(ModuleName, ExceptFileName))
if ExceptFileName is not None:
ListOfExceptFiles.append(ExceptFileName)
此外,您還假設屬性的標簽只能是Name
, Shortname
或ExcludeList
。 雖然確實如此,但格式錯誤的文件會破壞您的解析。 考慮檢查所有屬性的標記屬性,並在出現問題時發出錯誤。
2)我假設具有相同名稱的文件實際上是模塊之間共享的同一文件,但在某些模塊中卻未在所有模塊中將其排除。 如果是這種情況,那么被排除文件的列表將丟失有關被排除文件屬於哪個模塊的信息。 考慮使用以模塊名稱為鍵的列表列表,以便每個模塊可以擁有自己的排除文件列表。
編輯使用dict
(我主要是面向Java的,在Java中將此結構稱為map,但在python中是dict
),可以是:
def GetExceptFiles(DictOfExceptFiles = {}):
tree = ET.ElementTree(file='Config.xml')
Modules = tree.getroot()
for Module in Modules:
for Attribute in Module:
if Attribute.tag=='Name':
ModuleName = Attribute.text
if Attribute.tag=='Shortname':
ModuleShortName = Attribute.text
for File in Attribute:
ExceptFileName = File.text
if(ModuleName not in DictOfExceptFiles)
DictOfExceptFiles[ModuleName] = []
DictOfExceptFiles[ModuleName].append(ExceptFileName)
print ('In module {} we must exclude {}'.format(ModuleName, ExceptFileName))
請注意,這假設已在第一個文件之前設置了ModuleName,這取決於組件的順序,這是XML無法保證的。 為了解決這個問題,我將名稱和簡稱從子標記移到了模塊的XML屬性,如下所示:
<Module name="ModuleName" shortName="short name">
...
</Module>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.