使用 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))