当值与列表中的文件匹配时,用另一个字典替换字典中的项目
Replace items in a dict with another dict when value matches file in list
我目前正在尝试使用我机器上本地存在的 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
中所述。我想做的是将我的字典的值与目录中的文件名列表进行比较,如果某些字典值与文件名列表中的项目匹配,则从匹配文件中提取的字典是代替价值。例如
{"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'}
# }
我目前正在尝试使用我机器上本地存在的 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
中所述。我想做的是将我的字典的值与目录中的文件名列表进行比较,如果某些字典值与文件名列表中的项目匹配,则从匹配文件中提取的字典是代替价值。例如
{"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'}
# }