Я пытаюсь перебрать папку, содержащую 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 от имени администратора, но это не сработало. Я попытался изменить свойства диска, чтобы предоставить полный доступ аутентифицированным пользователям.
Свойства папки по-прежнему доступны только для чтения, и каждый раз, когда я меняю их, они снова становятся доступными только для чтения.
Это можно как-то исправить? Если есть другой метод, который позволит мне перебирать файлы в папках внутри zip-файлов и сохранять их имена и размеры в словаре, это тоже поможет.
Это папка с zip файлами. Я хочу перебрать несколько zip-файлов и сохранить имена файлов и размеры всех подкаталогов и файлов в каждом из них.
Обновленный ответ для перебора всех файлов .zip, затем перебора записей zip-файла и сохранения их в словаре.
Попробуйте изменить путь к r'D:\Project\I20\top'
. Если это путь к папке, то ваш код пытается прочитать несуществующий ZIP-файл с таким же именем.
Если вы хотите получить список файлов .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]
Теперь у вас будет список строк, представляющих имена файлов. Теперь вы можете манипулировать этими строками, как если бы они были именами файлов, и выяснить, что находится в каком каталоге.
Является ли
D:\Project\I20\top
zip-файлом или папкой с zip-файлами? Вы перебираете один zip-файл или несколько zip-файлов?