Python 当值与列表中的文件匹配时,用另一个dict替换dict中的项

Python 当值与列表中的文件匹配时,用另一个dict替换dict中的项,python,loops,dictionary,string-comparison,Python,Loops,Dictionary,String Comparison,我目前正在尝试使用本地机器上存在的HTML文件自动生成文档。每个HTML文档都是根据它描述的对象命名的,我只对获取每个对象属性的名称和每个属性的数据类型感兴趣,并保留某些对象之间的层次关系 到目前为止,我有以下代码: import os from lxml import html fileList = [] for folderName, subFolders, filenames in os.walk("Path/To/Relevant/Files"): for filename

我目前正在尝试使用本地机器上存在的HTML文件自动生成文档。每个HTML文档都是根据它描述的对象命名的,我只对获取每个对象属性的名称和每个属性的数据类型感兴趣,并保留某些对象之间的层次关系

到目前为止,我有以下代码:

import os
from lxml import html


fileList = []

for folderName, subFolders, filenames in os.walk("Path/To/Relevant/Files"):
    for filename in filenames:
            fileList.append(folderName + "/" + filename)

propertyDictList = []

for i in range(0, len(fileList)):
    file = open(fileList[i])
    page = file.read()
    tree = html.fromstring(page)

    propertyNameXpath = tree.xpath("//someXpathquery")
    propertyNames = [str(i) for i in propertyNameXpath]

    propertyTypeXpath = tree.xpath("//anotherXpathquery")
    propertyTypes = [str(i) for i in propertyTypeXpath]

    propertyDict = dict(zip(propertyNames, propertyTypes))

    propertyDictList.append(propertyDict)
这段代码从目录中的每个文件中获取每个属性的名称和数据类型,并将它们作为字典项放入键值对中,每个文件对应一个字典。然后将这些词典附加到
propertyDictList

我现在想弄清楚的是,我如何在某些对象之间重新建立层次关系。例如,假设我有一个描述对象“foo”的文件。让我们调用文件名
Path/To/Relevant/Files/foo.html
。现在,这个“foo”对象可能有几个属性,因此描述它的字典如下所示:

{“bar”:“string”,“baz”:“int”,“fizz”:“buzz”}

“buzz”
数据类型实际上是指目录中存在的另一个对象,如
Path/to/Relevant/Files/buzz.html
中所述。我想做的是将我的字典的值与目录中的文件名列表进行比较,如果某个字典值与文件名列表中的某个项匹配,则将从匹配文件中提取的字典替换该值。e、 g


{“bar”:“string”、“baz”:“int”、“fizz”:{“baa”:“ram”、“ewe”:“fleece”}

在当前代码中,您不存储从文件名到从文件提取的属性的映射。假设你加上这一点,你所说的扩展是相对简单的:

props_by_file = {
  "foo": {"bar" : "string", "baz" : "int", "fizz" : "buzz"},
  "buzz": { "baa" : "ram" , "ewe" : "fleece" }
}

for file_props in props_by_file.values():
  for k, v in file_props.items():
    if v in props_by_file:
      file_props[k] = props_by_file[v]

props_by_file
# {'foo': {'bar': 'string', 'baz': 'int', 'fizz': {'baa': 'ram', 'ewe': 'fleece'}},
#  'buzz':                                        {'baa': 'ram', 'ewe': 'fleece'}
# }

在当前代码中,不存储从文件名到从文件中提取的属性的映射。假设你加上这一点,你所说的扩展是相对简单的:

props_by_file = {
  "foo": {"bar" : "string", "baz" : "int", "fizz" : "buzz"},
  "buzz": { "baa" : "ram" , "ewe" : "fleece" }
}

for file_props in props_by_file.values():
  for k, v in file_props.items():
    if v in props_by_file:
      file_props[k] = props_by_file[v]

props_by_file
# {'foo': {'bar': 'string', 'baz': 'int', 'fizz': {'baa': 'ram', 'ewe': 'fleece'}},
#  'buzz':                                        {'baa': 'ram', 'ewe': 'fleece'}
# }

与你的主要问题无关,一些评论:对于范围(0,len(x))中的i,更喜欢
而不是
,不要使用8个字符的缩进,更喜欢使用上下文管理器而不是open()。与你的主要问题无关,一些评论:对于范围(0,len(x))中的i,更喜欢
而不是
,不要使用8个字符的缩进,与其使用open(),不如使用上下文管理器。我继续向现有for循环添加了一些代码,以构建您建议的映射,并使用了您包含的for循环。它完全符合我的要求。非常感谢。我继续向现有的for循环添加了一些代码,以构建您建议的映射,并使用了您包含的for循环。它完全符合我的要求。非常感谢你。