2011-12-14 90 views
0

我做了原子建模,並使用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

首先所有的黑客:

  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

相關問題