Как я могу перечислить только папки в zip-архиве в Python? - PullRequest
7 голосов
/ 28 июня 2011

Как я могу перечислить только папки из zip-архива?Это будет список всех папок и файлов из архива:

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

Спасибо.

Ответы [ 4 ]

7 голосов
/ 28 июня 2011

Один из способов сделать это:

>>> [x for x in file.namelist() if x.endswith('/')]
<<< ['folder/', 'folder2/']
2 голосов
/ 08 марта 2018

В питоне 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)
1 голос
/ 23 марта 2016

Я не думаю, что предыдущие ответы являются кросс-платформенными, поскольку они предполагают, что pathsep равен /, как отмечено в некоторых комментариях.Также они игнорируют подкаталоги (которые могут иметь или не иметь значения для 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]

(Конечно, последние два шага можно объединить:)

0 голосов
/ 01 апреля 2014

больше по линии

set([os.path.split(x)[0] for x in zf.namelist() if '/' in x])

потому что zip-файл python не хранит только папки

...