簡體   English   中英

使用Python解析文件夾中除要在XML文件中鍵入的文件以外的所有文件

[英]Parse all files in a folder except ones being typed in an XML file, using Python

新手程序員,適合您的Python環境。

我有的:

  1. 一個文件夾,其中包含其他文件夾(模塊)和文件(可能是.txt,.c,.h,.py等)
  2. 一個XML文件,該文件基本上包含該文件夾的配置(模塊名稱,短名稱以及一個排除列表。不得考慮排除列表中的那些內容)

我打算做什么:

  • 從XML文件中讀取信息並將其保存在有助於我正確解析的問題上
  • 解析給定文件夾中的所有文件,但排除的文件除外

到目前為止,我的代碼如下所示:

<?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:

這是它做對的兩件事:

  1. 相同名稱的文件將損壞輸出。
  2. 在xml中有一個以上的文件(一個模塊)除外,這將導致僅最后一個被跳過。 (在我的示例中,HeaderFile.h將不會被跳過,而CFile.c將會被)

編輯:@ 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) 

此外,您還假設屬性的標簽只能是NameShortnameExcludeList 雖然確實如此,但格式錯誤的文件會破壞您的解析。 考慮檢查所有屬性的標記屬性,並在出現問題時發出錯誤。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM