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

时间:2018-07-27 15:35:24

标签: python python-2.7 zip

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

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

最后修改,存档大小,内容大小,压缩率,文件数

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

2 个答案:

答案 0 :(得分:1)

此信息在ZIP存档中不可用,可以作为单个结构访问。我不确定Archive Manager如何实现它,也没有人来检查它,但是我认为它是档案本身的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

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

有了这一点,您需要得到一个警告,将压缩比除以csizeosize。由于您是使用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的,并且适用于所使用的任何工具或语言。

答案 1 :(得分:-1)

只要使用“ 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脚本中