8.5.2 从归档读取元数据
使用ZipFile类可以直接处理一个ZIP归档。这个类支持一些方法来读取现有归档的有关数据,还可以通过增加更多的文件来修改归档。
import zipfile
with zipfile.ZipFile('example.zip','r') as zf:
print(zf.namelist())
namelist()方法返回一个现有归档中的文件名。
运行结果:
[‘README.txt’]
不过,这个文件名列表指示从归档得到的信息的一部分。要访问有关ZIP内容的所有元数据,可以使用infolist()或getinfo()方法。
import datetime
import zipfile
def print_info(archive_name):
with zipfile.ZipFile(archive_name) as zf:
for info in zf.infolist():
print(info.filename)
print(' Comment :',info.comment)
mod_date = datetime.datetime(*info.date_time)
print(' Modified :',mod_date)
if info.create_system == 0:
system = 'Windows'
elif info.create_system == 3:
system = 'Unix'
else:
system = 'UNKNOWN'
print(' System :',system)
print(' ZIP version :',info.create_version)
print(' Compressed :',info.compress_size,'bytes')
print(' Uncompressed :',info.file_size,'bytes')
print()
if __name__ == '__main__':
print_info('example.zip')
除了这里打印的字段,元数据还包括另外一些字段,但是要把这些值解释为有用的信息,需要仔细阅读ZIP文件规范的"PKZIP应用说明"(PKZIP Application Note)。
运行结果:
如果提前已经知道归档成员名,可以利用getinfo()直接获取其ZipInfo对象。
import zipfile
with zipfile.ZipFile('example.zip') as zf:
for filename in ['README.txt','notthere.txt']:
try:
info = zf.getinfo(filename)
except KeyError:
print('ERROR:Did not find {} in zip file'.format(
filename))
else:
print('{} is {} bytes'.format(
info.filename,info.file_size))
如果归档成员不存在,getinfo()会产生一个KeyError。
运行结果:
README.txt is 8 bytes
ERROR:Did not find notthere.txt in zip file