我做原子建模,并使用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个我想摆脱的脏黑客:
我在\
中分割了完整路径,获得了祖先目录列表
职位,这是特定于Linux的;
我通过尝试在.EXT
列表中找到字符串中的扩展名来查找filenames
文件是否在目录中,并考虑到s.find
返回-1
如果找不到子字符串。
有没有办法让这些代码块更具可读性?
答案 0 :(得分: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)
希望这有帮助!