我试图找出如何做到这一点(google,SO等),但我可能使用了错误的关键字......
基本上我逐行循环遍历文件,如果我点击一个关键字,我想将它添加到字典作为其键,但是,我想将其值添加为初始字典字典,然后任何后续命中作为一个孩子(等等),除非我点击一个关闭字符,它将在字典中上升一级。
示例文件:
def myitem {
def aSubItem {
abc
}
def anotherSubItem {
hi!
hows you?
}
}
所以我得到这样的字典:
mydict = {
"myitem" : {
"aSubItem" : { "abc" },
"anotherSubItem" : { "hi!", "hows you?" }
}
}
基本上,我在某种程度上可以存储当前深度(或dict访问权限),因此,您可以访问' abc'通过做mydict [' myitem'] [' aSubItem'],但是我希望能够存储我有多深,因为有人在那个块中添加了一些东西...所以类似于:
curLevel = ['myitem']['aSubItem']
然后我可以告诉mydict访问curLevel,然后当块完成时(点击}),我可以告诉它上升到一个级别'到
curLevel = ['myitem']
我知道我可以使用
curLevel = mydict
这将让我使用curLevel访问myDic ... 这可以很好地进入字典级别......
然而,我怎么会上升? 即如果我有:curLevel = mydict['myitem']['aSubItem']
我怎么去
curLevel = mydict['myitem']
====================
以下是一些示例代码,因为每个人都喜欢示例代码:P
这正在下载到字典中,我只是不确定如何让它重新开始
import os
import re
# file location
fle = "myfilelocation"
# read file contents
fh = open(fle, 'r')
content = fh.readlines()
# The dictionary to hold the structure
structure = {}
# reference to structure that we will use in the loop
cur = structure
# loop through file lines
for line in content:
# Match our starting def line ( def ___ { )
st = re.match(r'\s*Def\s([^{\s]+)', line, re.IGNORECASE)
if st:
cur[st.group(1)] = {}
cur = cur[st.group(1)]
# Match the close of a block ( } )
ed = re.match(r'\s*}\s*', line)
if ed:
# ??? How do I tell it to go up one dict level??
None
# If its neither, add to current level of array
# Don't mind the inefficiency here, I'll be improving it later
if not st and not ed and not re.match(r'\s*{\s*$', line) and not re.match(r'\s*$', line):
# Not implemented yet
None
print(structure)
目前上面示例代码的输出类似于
mydict = {
"myitem" : {
"aSubItem" : {
"anotherSubItem" : {}
}
}
}
}
如果需要更多信息,我很乐意提供:)
(是的,我知道我可能会使用解析器......但我完全没有任何运气......此外,从头开始写东西是一个很好的练习xD)
答案 0 :(得分:1)
正如您所指出的那样,孩子们不会自动提及他们的父母,所以你不能只是“回去”。
您需要明确地为这些引用提供一个特殊键,如__parent
或某些不会被实际键复制的内容,或者保留一个单独的列表,作为“堆栈”并跟踪您在树中的当前路径,随时添加新关卡并pop
将它们返回到父级。
curLevel = ['myitem']['aSubItem']
几乎在那里,但不起作用,只需使用一个列表curLevel = ['myitem', 'aSubItem']
和append
以及pop
。
根据您的需要,保留对列表中字典的引用,或者将密钥保留在那里,然后使用密钥从基础对象向上走。