2

zipfileおよびtarfile Python モジュールを使用して、アーカイブを開き、抽出し、圧縮しています。
アーカイブ構造を QTreeWidget に表示する必要がありますが、どうすればよいかわかりません。情報を取得するには、このファイルinfos(path)の関数を使用します。このようなものを(Arkから)入手したいと思います:
代替テキスト

たとえば、この filenames: を受け取った場合、これ('GCI/PyFiles/prova3.py', 'GCI/', 'GCI/PyFiles/', 'GCI/Screenshots/', 'GCI/prova2.py', 'prova.py')を取得したいと思います:

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

私のQTreeWidgetで。

ありがとう、ルービック

4

1 に答える 1

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', '']]
于 2011-01-05T20:08:47.390 に答える