获取 zip 文件详细信息 - 而不是从其内容中获取



在 Python2 中创建 zip 文件后,如何获取 zip 的详细信息?这不是关于它包含文件,而是zip本身。

在Linux上,使用"存档管理器"打开zip文件可以显示属性:

">上次修改时间、存档大小、内容大小、压缩率、文件数"

如何从 python 脚本中获取这些属性?

此信息在 ZIP 存档中不作为单个结构提供。我不确定存档管理器是如何实现它的,我周围也没有一个可以检查它,但我认为它是存档本身stat的组合,以检索其上次修改的时间和大小。例如,对于存档ar.zip

os.stat('ar.zip').st_mtime  # last modification of the archive
os.stat('ar.zip').st_size  # size of the archive

并迭代存档成员信息以供其余部分使用。对于 ZIP 文件,此操作实际上不应该过于昂贵,因为有一个目录指向存档末尾的所有条目,因此不必完整读取它。

例如:

osize = csize = cnt = 0
for item in z.infolist():
osize += item.file_size
csize += item.compress_size
cnt += 1

将为您提供所有文件的原始(未压缩)大小csize存档中的压缩大小以及存档中所有条目的数量cntosize

有了它,您可以获得压缩比除以csize除以osize,但有一个警告。由于您使用python 2.7提及/标记,因此不要忘记将(至少)其中一个转换为float以强制结果也浮点:ratio = float(czise) / osize。在Pyton 3上,/无论如何都会产生float

当然,您可以将所有这些包装成一个方便的函数,您可以将打开的zip存档传递给:

def zip_details(archive_obj):
archive_info = {'original_size': 0,
'compressed_size': 0,
'total_entries': 0}
archive_info['total_size'] = os.fstat(archive_obj.fp.fileno()).st_size
archive_info['last_change'] = os.fstat(archive_obj.fp.fileno()).st_mtime
for item in archive_obj.infolist():
archive_info['original_size'] += item.file_size
archive_info['compressed_size'] += item.compress_size
archive_info['total_entries'] += 1
archive_info['compression_ration'] = float(archive_info['compressed_size']) / archive_info['original_size']
return archive_info

并获得包含所需详细信息的字典作为回报。或者,您可以对zipfile.ZipFile进行子类化,并将此功能添加为其方法。

您在问题标题中表达了排除使用内容的限制,但恐怕,除了总体大小和上次修改时间之外,现有存档无法满足该条件。其他一切都只能通过查看档案本身来学习。文件计数来自其末尾的目录,以及来自存储在单个文件上的信息的更多详细信息。这不是特定于 python 的,适用于使用的任何工具或语言。

只要使用"bash"(如在 Linux 中),这里有一个简单的方法,可以通过获取 zip 存档属性来压缩给定的文件/目录列表

import os
bashCommand = "zip -r -v" 
" " + "./my-extension.zip" 
" " + "file1 file2 fileN dir1 dir2 dirN" 
" " + "| grep 'total bytes=' > zip.log"
os.system(bashCommand)

注意:当然这可以直接在操作系统提示符下执行,但目的是将调用包含在更大的python脚本中

最新更新