2011-12-14 2 views
0

Я занимаюсь атомистическим моделированием и использую Python для анализа результатов моделирования. Чтобы упростить работу с целым рядом скриптов Python, используемых для разных задач, я решил написать простой графический интерфейс для запуска скриптов из него.WxPython - создание дерева каталогов на основе доступности файла

У меня есть (довольно сложная) структура каталогов, начиная с некоторого корня (скажем ~/calc), и я хочу заполнить wx.TreeCtrl контроль с каталогами, содержащими результаты расчета, сохраняющие их структуру. Папка содержит результаты, если она содержит файл с расширением .EXT. То, что я пытаюсь сделать, - это пройти через dirs от root и в каждом каталоге проверить, содержит ли он файл .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. Чтобы получить путь Seperator для любой ОС вы используете вы можете использовать os.sep.

  2. Использование str.endswith() и использовать тот факт, что в Python пустой список [] соответствует значению ЛОЖЬ:

    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

Большое спасибо, ваш код определенно более читабельным. Что касается заполнения дерева, я думал о рекурсии, но я не вижу способа использовать его в этой задаче, поскольку я знаю, нужен ли мне каталог 1-го уровня, только пройдя весь путь до него. Но вчера вечером я обнаружил ошибку в своем коде, так что теперь она работает так, как ожидалось. –

Смежные вопросы