我几乎可以肯定有一个简单的解决方案,但我已经花了几个小时读取和重读相同的一组相关结果我很难回答我的问题。漫步/遍历任意深度的嵌套字典(字典表示一个目录树)
这个问题的背景下(包括完成,但随意跳过此)
在此之前,因为我希望用户能够在一个目录内选择一组文件(以及任何子目录),不幸的是,在Windows 7(http://bugs.python.org/issue8010)中,Tkinter在文件对话框中选择多个文件的默认功能被破坏。因此,我试图通过替代方法(仍然使用Tkinter)来表示目录结构:构造目录结构的传真,由标记和缩进复选框(以树组织)组成。因此,像这样的目录:
\SomeRootDirectory
\foo.txt
\bar.txt
\Stories
\Horror
\rickscott.txt
\Trash
\notscary.txt
\Cyberpunk
\Poems
\doyoureadme.txt
会是这个样子(其中#代表checkbutton):
SomeRootDirectory
# foo.txt
# bar.txt
Stories
Horror
# rickscott.txt
Trash
# notscary.txt
Cyberpunk
Poems
# doyoureadme.txt
建立从目录结构中的原始字典很容易使用特定的食谱,我发现在ActiveState(见下文),但是当我尝试迭代我留下的很好的嵌套字典时,我碰到了一堵墙。我想我需要遍历它,以便用一个漂亮的树形网格表示来填充一个Tkinter框架。然后我希望通过解释哪些复选框是真的还是假的,来加载用户选择的各种文本文件。除了遍历字典而没有修复深度的以外,一切似乎都相当简单。
更抽象的术语
为了让我使用的是ActiveState的配方,这些嵌套的字典 - http://code.activestate.com/recipes/577879/。它实现os.walk来制作这样的字典:
a={
'SomeRootDirectory': {
'foo.txt': None,
'bar.txt': None,
'Stories': {
'Horror': {
'rickscott.txt' : None,
'Trash' : {
'notscary.txt' : None,
},
},
'Cyberpunk' : None
},
'Poems' : {
'doyoureadme.txt' : None
}
}
}
在这之后我就难住了。我是一个Python新手,仅仅是一个人文科学专业......在我看来,这意味着递归对我来说非常混乱。所以我查看了食谱,并尝试了各种类似的答案,但无济于事。我需要能够迭代这个字典,以便填充它的另一个表示形式,并且在这样做之后(即在用户选择了哪些文件之后)重建对这些文件的引用。
我很抱歉,如果这太冗长!感谢您的帮助!
解决方案改编自spicavigo的响应
#distinguish between directory and file
dirtab = "/==="
filetab = "|---"
Parents={-1:"Root"}
def add_dir(level, parent, index, k):
print (dirtab*level)+k
def add_file(level, parent, index, k):
#Currently an empty folder gets passed to add_file; here's a quick treatment.
if "." in k:
print (filetab*level)+k
else:
print (dirtab*level)+k
def addemup(level=0, parent=-1, index=0, di={}):
for k in di:
index +=1
if di[k]:
Parents[index]=k
add_dir(level, parent, index, k)
addemup(level+1, index, index, di[k])
else:
add_file(level, parent, index, k)
addemup(di=a) #dictionary from above
这会产生,我认为会很容易修改成Tkinter的代表性的东西:
SomeRootDirectory
/===Poems
|---|---doyoureadme.txt
/===Stories
/===/===Horror
|---|---|---rickscott.txt
/===/===/===Trash
|---|---|---|---notscary.txt
/===/===Cyberpunk
|---foo.txt
|---bar.txt
谢谢,这个社会是不可思议的。
当你遍历字典键值对(这需要字典作为自变量的函数内),您可以检查是否值是一个字典类型,如果是,则调用函数再次即在这里使用递归,并将该值作为字典传递给函数,否则处理值..这应该解决变量深度迭代问题 – avasal