WxPython - построение дерева каталогов на основе доступности файлов - PullRequest
0 голосов
/ 14 декабря 2011

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

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

Прежде всего хаки:

  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)

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...