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级肮脏的黑客我想摆脱:

  1. 我得到祖先迪尔斯名单与分裂的\ 位置的完整路径,这是Linux的具体;

  2. 我觉得如果.EXT文件所在的目录,试图从filenames列表中找到字符串中的延伸,同时在帐户s.find返回-1如果子没有找到。

有没有办法让这些代码块更具可读性?

首先所有的黑客:

  1. 要获得任何操作系统中使用,你可以用你的os.sep的路径分隔符。

  2. 使用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) 

希望这有助于!

+0

非常感谢,你的代码肯定更具可读性。至于填充树,我考虑了递归,但我没有看到在这个问题中使用它的方式,因为我知道我是否需要第一级目录只是一直贯穿它。但昨晚我在代码中发现错误,所以现在它按预期工作。 – 2011-12-15 05:53:09