Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python解析文件夹中的所有文件,但在XML文件中键入的文件除外_Python_Xml_Parsing - Fatal编程技术网

使用Python解析文件夹中的所有文件,但在XML文件中键入的文件除外

使用Python解析文件夹中的所有文件,但在XML文件中键入的文件除外,python,xml,parsing,Python,Xml,Parsing,新手程序员为您提供Python环境 我所拥有的: 包含其他文件夹(模块)和文件(可能是.txt、.c、.h、.py等)的文件夹 基本上包含该文件夹配置的XML文件(模块名、短名称,但也包括排除列表。排除列表中的内容不得考虑在内) 我打算做的是: 从XML文件中读取信息,并将其保存在一个有助于正确解析的文件中 解析给定文件夹中的所有文件,排除的文件除外 到目前为止,我的代码如下所示: <?xml version="1.0"?> <Modules> <Mod

新手程序员为您提供Python环境

我所拥有的:

  • 包含其他文件夹(模块)和文件(可能是.txt、.c、.h、.py等)的文件夹
  • 基本上包含该文件夹配置的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>
    
    <Module name="ModuleName" shortName="short name">
        ...
    </Module>
    
    这一个将读取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:
    
    有两件事它做得不对:

  • 同名文件将损坏输出
  • 如果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
    属性末尾的列表中。这导致只添加最后一个文件。在将复选框移到文件上方时,应将所有排除的文件添加到列表中。(几个选项卡/空格就足够了)

    此外,您假设属性的标记只能是
    Name
    Shortname
    ExcludeList
    。虽然这种情况肯定会发生,但格式错误的文件会破坏您的解析。考虑检查所有属性的标记属性并在错误的情况下发出错误。 2) 我假设具有相同名称的文件实际上是模块之间共享的同一个文件,这些文件在某些模块中被排除在外,但并非全部。如果是这种情况,则排除文件列表将丢失有关排除lsit所属模块的信息。考虑使用模块的名称列表作为一个键的列表,以便每个模块可以有自己的排除文件列表。 编辑使用
    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不能保证的。为了解决这个问题,我将把name和shortname从子标记移动到模块的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>
    
    <Module name="ModuleName" shortName="short name">
        ...
    </Module>
    
    
    ...
    
    这项工作做得很好,只有一小部分需要解决的问题:

    1) 在您的
    GetExceptFiles(ListOfExceptFiles=[])
    中,将文件添加到for over
    属性末尾的列表中。这导致只添加最后一个文件。在将复选框移到文件上方时,应将所有排除的文件添加到列表中。(几个选项卡/空格就足够了)

    此外,您假设属性的标记只能是
    Name
    Shortname
    ExcludeList
    。虽然这种情况肯定会发生,但格式错误的文件会破坏您的解析。考虑检查所有属性的标记属性并在错误的情况下发出错误。 2) 我假设具有相同名称的文件实际上是模块之间共享的同一个文件,这些文件在某些模块中被排除在外,但并非全部。如果是这种情况,则排除文件列表将丢失有关排除lsit所属模块的信息。考虑使用模块的名称列表作为一个键的列表,以便每个模块可以有自己的排除文件列表。 编辑使用
    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不能保证的。为了解决这个问题,我将把name和shortname从子标记移动到模块的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>
    
    <Module name="ModuleName" shortName="short name">
        ...
    </Module>
    
    
    ...
    
    这看起来是个不错的问题,但我想问的是,长块的元评论或辩护被省略了,因为它们通常会被删减,并且会导致一些人做一些工作。从问题的陈述来看,努力应该是显而易见的,而不是因为最后有一个很长的免责声明(这些自相矛盾的做法有时会导致反对票,因为一些读者不喜欢辩护)。长话短说:保持简洁@哈弗明白了,谢谢。这看起来是个好问题,但我想问的是,长块的元评论或辩护被省略了,因为它们通常会被修剪,并且会导致一些人做一些工作。从问题的表现来看,努力应该是显而易见的,而不是因为最后有一个很长的免责声明(