WxPython - 根据文件可用性构建目录树

时间:2011-12-14 12:30:55

标签: python user-interface wxpython

我做原子建模,并使用Python来分析模拟结果。为了简化用于不同任务的一大堆Python脚本的工作,我决定编写简单的GUI来从中运行脚本。

我有一个(相当复杂的)目录结构从一些根开始(比如~/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如果找不到子字符串。

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

1 个答案:

答案 0 :(得分:1)

首先是黑客攻击:

  1. 要获取您使用的任何操作系统的路径分隔符,您可以使用os.sep

  2. 使用str.endswith()并使用以下事实:在Python中,空列表[]的计算结果为False:

    if [ file for file in filenames if file.endswith('.EXT') ]:

  3. 在将它们全部嵌套好的方面,你最好以递归方式进行。所以伪代码看起来像下面这样。请注意,这只是为了让您了解如何操作,不要指望它能够正常工作!

    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)
    

    希望这有帮助!