WxPython - 基于文件可用性构建目录树
问题描述:
我做了原子建模,并使用Python来分析仿真结果。为了简化用于不同任务的大量Python脚本的工作,我决定编写简单的GUI来从中运行脚本。WxPython - 基于文件可用性构建目录树
我有一个(相当复杂的)目录结构从一些根(比如~/calc
)开始,我想用包含保存其结构的计算结果的目录填充wx.TreeCtrl
控件。如果文件夹包含扩展名为.EXT
的文件,则该文件夹包含结果。我试图做的是从根目录和每个目录中检查是否包含.EXT
文件。当达到这样的目录,它和它的祖先树添加:
def buildTree(self, rootdir):
root = rootdir
r = len(rootdir.split('/'))
ids = {root : self.CalcTree.AddRoot(root)}
for (dirpath, dirnames, filenames) in os.walk(root):
for dirname in dirnames:
fullpath = os.path.join(dirpath, dirname)
if sum([s.find('.EXT') for s in filenames]) > -1 * len(filenames):
ancdirs = fullpath.split('/')[r:]
ad = rootdir
for ancdir in ancdirs:
d = os.path.join(ad, ancdir)
ids[d] = self.CalcTree.AppendItem(ids[ad], ancdir)
ad = d
但这个代码最终与具有相同名称的许多二级节点,这绝对不是我想要的。所以我需要查看节点是否已经添加到树中,并且在正面情况下为现有节点添加新节点,但我不明白这是如何实现的。你能给我一个提示吗?
此外,该代码包含2级肮脏的黑客我想摆脱:
我得到祖先迪尔斯名单与分裂的
\
位置的完整路径,这是Linux的具体;我觉得如果
.EXT
文件所在的目录,试图从filenames
列表中找到字符串中的延伸,同时在帐户s.find
返回-1
如果子没有找到。
有没有办法让这些代码块更具可读性?
答
首先所有的黑客:
要获得任何操作系统中使用,你可以用你的
os.sep
的路径分隔符。-
使用str.endswith(),并使用的事实,在Python空列表
[]
值为False:if [ file for file in filenames if file.endswith('.EXT') ]:
在让他们所有的方面很好地嵌套你是最好的关闭做递归。所以伪代码看起来如下所示。请注意,这只是为了让你了解如何做到这一点,不要指望它按照原样工作!
def buildTree(self, rootdir):
rootId = self.CalcTree.AddRoot(root)
self.buildTreeRecursion(rootdir, rootId)
def buildTreeRecursion(self, dir, parentId)
# Iterate over the files in dir
for file in dirFiles:
id = self.CalcTree.AppendItem(parentId, file)
if file is a directory:
self.buildTreeRecursion(file, id)
希望这有助于!
非常感谢,你的代码肯定更具可读性。至于填充树,我考虑了递归,但我没有看到在这个问题中使用它的方式,因为我知道我是否需要第一级目录只是一直贯穿它。但昨晚我在代码中发现错误,所以现在它按预期工作。 – 2011-12-15 05:53:09