问题描述
我想在不提取文件的情况下对压缩文件执行 os.walk。 zipfile 模块可以提供所需的信息。有没有人有一个脚本可以在查看未压缩的目录树时输出与 os.walk 输出的元组列表相同的元组列表?
我有一个部分解决方案。这只会深入一层并输出到字典,该字典可以轻松转换为 os.walk() 输出格式:
import zipfile
def zipwalk(zfile):
dlistdb = {'' : []}
for info in zfile.infolist():
ilist = info.filename.split('/')
if '' in ilist:
ilist.remove('')
if info.is_dir():
dlistdb[ilist[-1]] = []
elif ilist[-2] in dlistdb:
dlistdb[ilist[-2]].append(ilist[-1])
else:
dlistdb[''].append(ilist[-1])
return dlistdb
解决方法
回答了我自己的问题。这是我的代码:
#!/usr/bin/python3
import os
import zipfile
# Mimic os.walk() function for zipfiles
def zipwalk(zfile):
# Initialize database
dlistdb = {}
# Walk through zip file information list
for info in zfile.infolist():
if info.is_dir():
zpath = os.path.dirname(os.path.dirname(info.filename).rstrip('/'))
zfile = os.path.basename(os.path.dirname(info.filename).rstrip('/'))
if zpath in dlistdb:
dlistdb[zpath][0].append(zfile)
else:
dlistdb[zpath] = [[zfile],[]]
else:
zpath = os.path.dirname(info.filename)
zfile = os.path.basename(info.filename)
if zpath in dlistdb:
dlistdb[zpath][1].append(zfile)
else:
dlistdb[zpath] = [[],[zfile]]
# Convert to os.walk() output format
dlist = []
for key in dlistdb.keys():
dlist.append((key,dlistdb[key][0],dlistdb[key][1]))
return iter(dlist)
zfile = zipfile.ZipFile('data/test.zip')
db = zipwalk(zfile)
print(list(db))