如何在Python中仅列出zip压缩包中的文件夹?

20 投票
4 回答
17920 浏览
提问于 2025-04-16 20:28

我怎么才能只列出一个压缩文件里的文件夹呢?下面的代码会列出压缩文件里的所有文件和文件夹:

import zipfile
file = zipfile.ZipFile("samples/sample.zip", "r")
for name in file.namelist():
    print name

谢谢。

4 个回答

6

在Python 3中,这里假设传给ZipFile的是绝对路径:

from zipfile import ZipFile

zip_f = ZipFile("./Filename.zip")

# All directories:
for f in zip_f.namelist():
    zinfo = zip_f.getinfo(f)
    if(zinfo.is_dir()):
        print(f)

# Only root directories:
root_dirs = []
for f in zip_f.namelist():
    zinfo = zip_f.getinfo(f)
    if zinfo.is_dir():
        # This is will work in any OS because the zip format
        # specifies a forward slash.
        r_dir = f.split('/')
        r_dir = r_dir[0]
        if r_dir not in root_dirs:
            root_dirs.append(r_dir)
for d in root_dirs:
    print(d)
12

我觉得之前的回答可能不适用于所有平台,因为它们假设路径分隔符是/,这在一些评论中提到过。此外,它们也忽略了子目录(这对Pythonpadavan来说可能重要,也可能不重要……问题中没有完全说明)。那这样怎么样:

import os
import zipfile

z = zipfile.ZipFile('some.zip', 'r')
dirs = list(set([os.path.dirname(x) for x in z.namelist()]))

如果你真的只想要顶层目录,那么可以把这个和agroszer的回答结合起来,作为最后一步:

topdirs = [os.path.split(x)[0] for x in dirs]

(当然,最后这两步也可以合并在一起 :)

12

一种方法可能是这样做:

>>> [x for x in file.namelist() if x.endswith('/')]
<<< ['folder/', 'folder2/']

撰写回答