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