使用Python解析文件夹中的所有文件,但在XML文件中键入的文件除外
新手程序员为您提供Python环境 我所拥有的:使用Python解析文件夹中的所有文件,但在XML文件中键入的文件除外,python,xml,parsing,Python,Xml,Parsing,新手程序员为您提供Python环境 我所拥有的: 包含其他文件夹(模块)和文件(可能是.txt、.c、.h、.py等)的文件夹 基本上包含该文件夹配置的XML文件(模块名、短名称,但也包括排除列表。排除列表中的内容不得考虑在内) 我打算做的是: 从XML文件中读取信息,并将其保存在一个有助于正确解析的文件中 解析给定文件夹中的所有文件,排除的文件除外 到目前为止,我的代码如下所示: <?xml version="1.0"?> <Modules> <Mod
- 从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:
有两件事它做得不对:
这是我从列表的概念开始得到的:
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>
...
这看起来是个不错的问题,但我想问的是,长块的元评论或辩护被省略了,因为它们通常会被删减,并且会导致一些人做一些工作。从问题的陈述来看,努力应该是显而易见的,而不是因为最后有一个很长的免责声明(这些自相矛盾的做法有时会导致反对票,因为一些读者不喜欢辩护)。长话短说:保持简洁@哈弗明白了,谢谢。这看起来是个好问题,但我想问的是,长块的元评论或辩护被省略了,因为它们通常会被修剪,并且会导致一些人做一些工作。从问题的表现来看,努力应该是显而易见的,而不是因为最后有一个很长的免责声明(