迭代 ZipFile 以获取文件名和大小列表

Iterating over ZipFile to get list of file names and sizes

我正在尝试遍历包含 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 文件列表,则可以在目录上使用 glob()rglob()。此外,ZipFile class 需要 .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

如果要在目标文件夹中递归查找 sub-folders 中的 .zip 文件,请将 glob() 替换为 rglob()

如果 zip 文件包含目录条目,请添加 if not entry.filename.endswith('/'): 以在打印条目之前忽略目录条目 and/or 将其添加到字典中。

您不能使用 ZipFile 打开目录,您只能打开一个 zip 文件。您需要阅读压缩文件中的文件列表:

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

您现在将拥有一个代表文件名的字符串列表。您现在可以像处理文件名一样处理这些字符串,并找出目录中的内容。