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

0 投票
1 回答
1634 浏览
提问于 2025-04-17 08:21

我在做原子级建模,并用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

但是这段代码最终导致很多第二级节点有相同的名字,这显然不是我想要的。所以我需要想办法检查这个节点是否已经添加到树里,如果已经添加,就把新节点加到现有的节点下,但我不太明白该怎么做。你能给我一点提示吗?

此外,代码里还有两个我想去掉的“脏技巧”:

  1. 我通过把完整路径在 \ 的位置拆分来获取上级目录的列表,这个方法是Linux特有的;

  2. 我通过在 filenames 列表中的字符串里查找后缀来判断目录里是否有 .EXT 文件,考虑到 s.find 如果找不到子串会返回 -1

有没有办法让这些代码块更易读呢?

1 个回答

2

首先,来看看一些小技巧:

  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)

希望这些对你有帮助!

撰写回答