2011-01-05 20 views
2

我正在使用zipfiletarfile Python模塊打開,提取和壓縮存檔。
我需要在QTreeWidget中顯示歸檔結構,我不知道如何繼續。要獲取相關信息,請使用this file的功能infos(path)。 我想獲得這樣的事情(從方舟):
alt textQTreeWidget中的目錄樹

例如,如果我收到這樣的文件名:('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 2011-01-06 08:30:48