2011-01-05 3 views
2

나는 zipfiletarfile 파이썬 모듈을 사용하여 아카이브를 열고, 압축하고 압축합니다.
QTreeWidget에 보관 구조를 표시해야하며 계속 진행할 수 없습니다. 정보를 얻으려면 infos(path) 함수를 사용합니다 (this file). 나는 (방주에서) 이런 식으로 뭔가를 얻기 위해 싶습니다 예를 들어
alt textQTreeWidget의 디렉토리 트리

, 나는이 파일 이름 받으면 내 QTreeWidget에

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

: ('GCI/PyFiles/prova3.py', 'GCI/', 'GCI/PyFiles/', 'GCI/Screenshots/', 'GCI/prova2.py', 'prova.py')를, 나는이를 얻기 위해 싶습니다 .

답변

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

관련 문제