Перебор ZipFile для получения списка имен и размеров файлов

Я пытаюсь перебрать папку, содержащую n подпапок, в каждой из которых есть подпапка с файлами TIFF. Используя модуль zipfile, я пробовал следующее:

path = 'D:\Project\I20\top'
with ZipFile(path, 'r') as zipObj:
    listOfiles = zipObj.infolist()
    for elem in listOfiles:
        print(elem.filename, ' : ', elem.file_size, ' : ')

Я получаю следующую ошибку, когда пытаюсь сделать это:

Traceback (most recent call last):
  File "D:\Test\algo\checksize.py", line 30, in <module>
    with ZipFile(path, 'r') as zipObj:
  File "C:\Users\manaT\AppData\Local\Programs\Python\Python39\lib\zipfile.py", line 1239, in __init__
    self.fp = io.open(file, filemode)
PermissionError: [Errno 13] Permission denied: 'D:\\Project\\I20\\top'

Я пытался запустить Atom от имени администратора, но это не сработало. Я попытался изменить свойства диска, чтобы предоставить полный доступ аутентифицированным пользователям.

Перебор ZipFile для получения списка имен и размеров файловПеребор ZipFile для получения списка имен и размеров файлов

Свойства папки по-прежнему доступны только для чтения, и каждый раз, когда я меняю их, они снова становятся доступными только для чтения.

Это можно как-то исправить? Если есть другой метод, который позволит мне перебирать файлы в папках внутри zip-файлов и сохранять их имена и размеры в словаре, это тоже поможет.

Является ли D:\Project\I20\top zip-файлом или папкой с zip-файлами? Вы перебираете один zip-файл или несколько zip-файлов?

CodeMonkey 02.05.2022 16:55

Это папка с zip файлами. Я хочу перебрать несколько zip-файлов и сохранить имена файлов и размеры всех подкаталогов и файлов в каждом из них.

shinama99 02.05.2022 17:01

Обновленный ответ для перебора всех файлов .zip, затем перебора записей zip-файла и сохранения их в словаре.

CodeMonkey 02.05.2022 17:13

Попробуйте изменить путь к r'D:\Project\I20\top'. Если это путь к папке, то ваш код пытается прочитать несуществующий ZIP-файл с таким же именем.

martineau 02.05.2022 17:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы хотите получить список файлов .zip в папке, вы можете использовать glob() или rglob() в каталоге. Кроме того, класс ZipFile ожидает в качестве аргумента путь к файлу .zip, а не каталог. Затем вы можете перебирать записи файла в zip-файле.

from pathlib import Path
from zipfile import ZipFile

zips = {} # dictionary of zip files and sizes
path = Path(r'D:\Project\I20\top')
for file in path.glob('*.zip'):
    with ZipFile(file, 'r') as zipObj:
        for entry in zipObj.infolist():
            print(entry.filename, ' : ', entry.file_size, ' : ')
            # store filename and size in dictionary
            zips[entry.filename] = entry.file_size

Если вы хотите рекурсивно найти файлы .zip во вложенных папках в целевой папке, замените glob() на rglob().

Если zip-файл содержит записи каталога, добавьте if not entry.filename.endswith('/'):, чтобы игнорировать записи каталога перед печатью записи и/или добавлением ее в словарь.

Вы не открываете каталог с помощью ZipFile, вы можете открыть только zip-файл. Вам нужно прочитать список файлов в zipfile:

with open(zipFile, 'r') as f:
   files = f.infolist()
filenames = [file.filename for file in files]

Теперь у вас будет список строк, представляющих имена файлов. Теперь вы можете манипулировать этими строками, как если бы они были именами файлов, и выяснить, что находится в каком каталоге.

Другие вопросы по теме