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
但是这段代码最终导致很多第二级节点有相同的名字,这显然不是我想要的。所以我需要想办法检查这个节点是否已经添加到树里,如果已经添加,就把新节点加到现有的节点下,但我不太明白该怎么做。你能给我一点提示吗?
此外,代码里还有两个我想去掉的“脏技巧”:
我通过把完整路径在
\
的位置拆分来获取上级目录的列表,这个方法是Linux特有的;我通过在
filenames
列表中的字符串里查找后缀来判断目录里是否有.EXT
文件,考虑到s.find
如果找不到子串会返回-1
。
有没有办法让这些代码块更易读呢?
1 个回答
2
首先,来看看一些小技巧:
如果你想知道你使用的操作系统的路径分隔符,可以用
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)
希望这些对你有帮助!