如何在Python中仅列出zip归档文件夹?

20

如何仅列出zip归档文件夹?

这将列出归档中的每个文件夹和文件:

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

谢谢。

4个回答

12

一种方法可能是这样的:

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

我也可以通过其他方式从完整列表中获取所需的文件夹列表,但是我有更多GB的zip文件,其中包含了许多10000个文件夹。我只想要更快的搜索。 - Pythonpadavan
@Pythonpadavan:有一个解决方案,但这不是Python的方式。它只能在Linux中使用。>>> os.system("unzip -l zip.zip|grep /$") 0 2011-06-28 22:59 zip/one/ 0zip.zip 替换为你的 filename - Kracekumar
谢谢,但操作系统已经确定了,你猜怎么着?是Windows。 - Pythonpadavan
如何仅获取根目录中的文件夹名称而不查看更多内容?给定 ['folder/', 'folder/f1', 'folder/f2', 'folder2/', 'folder/f3', 'folder/f4'],我想要得到 ['folder', 'folder2'] - Pedro P. Camellon

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]

(当然,最后两步可以合并 :))

很好的解决方案,但要考虑压缩文件中位于“根目录”而不在目录中的文件的边缘情况。它们的 os.path.dirname 将产生 '',你可能不想将其列为目录。 - EliadL
1
代码中有一个错别字,应该是 z = zipfile.ZipFile('some.zip', 'r') - bmabir17
@bmabir17,我已经更正了拼写错误,感谢您的报告。 - Benjamin Loison

5
在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)

我不得不在root_dirs=[]之前加入os.chdir(directory),并从我的代码中删除了if zinfo.is_dir(),以使其正常工作。谢谢,这帮了我很多。 - Nahuatl_C137
感谢@Nahuatl_C137!我认为你需要使用chdir,因为我的示例需要绝对路径(已修复),但是我有点困惑于is_dir()不起作用,因为它仅检查文件名末尾的'/'是否存在。你得到了什么行为? - Devyzr
我有一个zip文件,其中大约有40个文件夹,包含700个左右的文档。在删除zinfo.is_dir()之前,代码正在遍历每个文件名(PDF),即“FolderName/PdfName”,并检查末尾是否有“/”。我想我会删除这行并保留分割,然后查看结果并进行调整,但事实证明这正是我所需要的;一个唯一的文件夹名称列表在.zip中。 - Nahuatl_C137
这就是目的,zinfo.is_dir()只需要检查一次,这样你就不必为zip中的每个元素拆分并检查数组以获取文件夹名称,从而减少操作次数。结果是相同的,但is_dir()检查应该使其更快。 - Devyzr
请查看以下内容:https://imgur.com/a/COKVpsF。我除了删除那个if语句之外,没有进行任何不同的操作。这样做我得不到一个文件夹名称。如果我想测试NOT zinfo.is_dir(),该怎么办?我想知道那会产生什么结果。 - Nahuatl_C137
奇怪,你的压缩文件结构是什么? - Devyzr

1
更多的是沿着这条路线。
set([os.path.split(x)[0] for x in zf.namelist() if '/' in x])

因为Python的zipfile不仅存储文件夹。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接