Я занимаюсь атомистическим моделированием и использую 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 ухищрений Я хотел бы избавиться:
Я получаю список предков директорий с расщеплением полного пути в
\
позиции, и это Linux- конкретный;Я считаю, если
.EXT
файл находится в директории, пытаясь найти продолжение в строках изfilenames
списка, принимая во внимание, чтоs.find
возвращает-1
, если подстрока не найдена.
Есть ли способ сделать эти куски кода более удобочитаемыми?
Большое спасибо, ваш код определенно более читабельным. Что касается заполнения дерева, я думал о рекурсии, но я не вижу способа использовать его в этой задаче, поскольку я знаю, нужен ли мне каталог 1-го уровня, только пройдя весь путь до него. Но вчера вечером я обнаружил ошибку в своем коде, так что теперь она работает так, как ожидалось. –