我正在使用 zipfile和 tarfile用于打开、提取和压缩文件的 Python 模块。
我需要在 QTreeWidget 中显示存档结构,但我不知道如何进行。为了获取信息,我使用了来自 this file 的函数 infos(path) . 我想获得这样的东西(来自方舟):
例如,如果我收到此文件名:('GCI/PyFiles/prova3.py', 'GCI/', 'GCI/PyFiles/', 'GCI/Screenshots/', 'GCI/prova2.py' py', 'prova.py'),我想得到这个:
- prova.py
- GCI/
|
|- prova2.py
|- PyFiles/
|- prova3.py
|- Screenshots/
在我的 QTreeWidget 中。
谢谢, 魔方
请您参考如下方法:
我不确定 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', '']]
