如何解决使用 zipfile 模块通过 zip 压缩文件执行 os.walk
我想在不提取文件的情况下对压缩文件执行 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))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。