【发布时间】:2021-07-08 08:22:26
【问题描述】:
我想将 .properties 文件的键和值解析为 python 字典。 我正在解析的 .properties 文件使用以下语法(键和值是示例):
key1.subkey1.subsubkey1=value1
key1.subkey1.subsubkey2=value2
key1.subkey2=value3
key2=value4
所以每个值对应一个键,该键由一个或多个用句点分隔的级别组成。 目标是创建一个 Python 字典,其中每个键都是一个包含其值和子键的字典。字典应该是递归可迭代的,所以每个级别都应该遵循相同的结构。
前面的例子应该产生以下类型的字典:
'subKeys':
'key1':
'subKeys':
'subkey1':
'subKeys':
'subsubkey1':
'val': 'value1'
'subsubkey2':
'val': 'value2'
'subkey2':
'val': 'value3'
'key2':
'val': 'value4'
我在 python 中使用以下算法循环它:
def setKeyAndValue(storageDict, rowParts):
keyParts = rowParts[0].split('.')
if not keyParts[0] in outputDict:
storageDict[keyParts[0]] = {}
newObj = storageDict[keyParts[0]]
for i in range(len(keyParts)):
if i == len(keyParts)-1:
# Reached the end of the key, save value to dictionary
newObj["val"] = rowParts[1]
else :
# Not yet at the end of the key
if "subKeys" not in newObj:
newObj["subKeys"] = {}
if keyParts[i+1] not in newObj["subKeys"]:
newObj["subKeys"][keyParts[i+1]] = {}
newObj = newObj["subKeys"][keyParts[i+1]]
f = open("FILEPATH.properties", "r")
outputDict = {}
outputDict["subKeys"] = {}
outputDictSubKeys = outputDict["subKeys"]
for row in f:
if not row.startswith('#') and not row.startswith('//'):
parts = row.split('=', 1)
if len(parts)== 2:
setKeyAndValue(outputDictSubKeys, parts)
f.close()
结果字典 (outputDict) 缺少两个键值对 (key1.subkey1.subsubkey1=value1, key1.subkey1.subsubkey2=value2):
'subKeys':
'key1':
'subKeys':
'subkey2':
'val': 'value3'
'key2':
'val': 'value4'
我很确定问题出在以下行:
newObj = newObj["subKeys"][keyParts[i+1]]
我用循环的每次迭代替换字典中的 newObj。
有没有办法调整这个现有的算法以使其工作,如果没有,我应该如何重新开始?效率不是问题,属性文件不是很大。
【问题讨论】:
-
你的代码中的 test1 是什么?
-
对不起,这是 outputDict 的原始名称,为了清楚起见,我将其重命名。
标签: python python-3.x dictionary parsing properties-file