在Python2中创建一个zip文件后,如何获取该zip文件的详细信息?它不是包含文件,而是zip本身。
在Linux上,使用“存档管理器”打开zip文件时,可以显示属性:
“ 最后修改,存档大小,内容大小,压缩率,文件数”
如何从python脚本中获取这些属性?
答案 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
的数量。
有了这一点,您需要得到一个警告,将压缩比除以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的,并且适用于所使用的任何工具或语言。
答案 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脚本中