2

我正在使用zipfiletarfile Python 模块来打开、提取和压缩档案。
我需要在 QTreeWidget 中显示存档结构,我不知道如何继续。要获取信息,我使用infos(path)文件中的函数。我想获得这样的东西(从方舟):
替代文字

例如,如果我收到这个文件名:('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 回答