第八章:数据压缩与归档-zipfile:ZIP归档访问-从归档读取元数据

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

猜你喜欢

转载自blog.csdn.net/weixin_43193719/article/details/89317796