2011-01-05 5 views
2

Я использую zipfile и tarfile Модули Python для открытия, извлечения и сжатия архивов.
Мне нужно отобразить структуру архива в QTreeWidget, и я не знаю, как это сделать. Чтобы получить информацию, я использую функцию infos(path) от this file. Я хотел бы получить что-то вроде этого (из ковчега):
alt textДерево каталогов в QTreeWidget

Например, если я получаю эти имена файлов: ('GCI/PyFiles/prova3.py', 'GCI/', 'GCI/PyFiles/', 'GCI/Screenshots/', 'GCI/prova2.py', 'prova.py'), я хотел бы получить это:

- prova.py 
- GCI/ 
    | 
    |- prova2.py 
    |- PyFiles/ 
      |- prova3.py 
    |- Screenshots/ 

в моей QTreeWidget ,

Спасибо, рубик

ответ

1

Я не знаю, как QTreeWidget хочет это экспромтом данные, но здесь (возможно, плохой способ), чтобы построить структуру в памяти.

x = ('GCI/PyFiles/prova3.py', 'GCI/', \ 
    'GCI/PyFiles/', 'GCI/Screenshots/', \ 
    'GCI/prova2.py', 'prova.py') 

structure = {} 
for fn in x: 
    path = fn.split('/') 

    tmpd = structure 
    for p in path[:-1]: 
     try: 
      tmpd = tmpd[p] 
     except KeyError: 
      tmpd = tmpd[p] = {} 

    tmpd[path[-1]] = None 

Это даст вам словарь structure что для каждого ключа либо другой словарь (представляющий папку) или None заявляет, что ключ является файлом.

Лучший способ сделать это было бы создать класс, как это:

class Node(object): 
    def __init__(self): 
     self.dirs = {} 
     self.files = [] 

или что-то подобное тому, которое вы можете заполнить. Если я правильно помню из своих дней программирования QT, QTreeWidget хочет иметь источник данных, поэтому вы в принципе можете понять, как выглядит этот источник, и соответствующим образом заполнить его. Там же, вероятно, возможность сделать это,

[sp for _,sp in sorted(
     (len(splitpath),splitpath) for splitpath in 
      (path.split('/') for path in x) 
     ) 
    ] 

который вернет вас:

[['prova.py'], ['GCI', ''], ['GCI', 'prova2.py'], 
['GCI', 'PyFiles', ''], ['GCI', 'PyFiles', 'prova3.py'], 
['GCI', 'Screenshots', '']] 
+0

Большое спасибо !! Вы спасли меня! – rubik

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