小白学Python,压缩和解压文件

目录

前言

一、判断文件是否为Zip文件

二、打开压缩文件 

三、解压文件

四、获取Zip文件中文件的属性信息


前言

Python标准库中的zipfile库可用于处理压缩文件,.zip是一种常用的压缩文件格式。zipfile库中包含用于查看Zip文件、解压Zip文件、将文件压缩为Zip文件等的方法。需要注意的是,在使用zipfile库前需要使用import导入zipfile库。


一、判断文件是否为Zip文件

zipfile库中提供了用于判断文件是否为Zip文件的is_zipfile()函数。其使用形式如下:

is_zipfile(filename)

参数filename: 表示需要判断的文件的路径。

返回值: 如果为Zip文件则返回True,否则返回False。

示例代码:

import zipfile
print(zipfile.is_zipfile('数据3\书代码.zip'))

第2行代码使用is_zipfile()函数判断相对路径的“数据3\书代码.zip”文件是否为Zip文件。执行代码后的输出结果为True。

注意,将非压缩文件的扩展名修改为.zip会被判断为False。


二、打开压缩文件 

打开压缩文件可以使用zipfile库中的类ZipFile实现,该类中包含打开、读取、写入、关闭和列出Zip文件的方法。类ZipFile的使用形式如下:

zipFile(file, mode="r", compression=ZIP_STORED, allowZip64=True, compresslevel=None)

参数file: 表示需要打开的压缩文件路径和文件名。

参数mode: 表示打开文件的模式,与open()函数的模式相似,此处打开压缩文件并不是直接解压压缩文件,而是与压缩文件建立联系。

注意

mode分别有'r'、'w'和'a'这3种值:

        第1种,默认情况下mode为'r',表示对压缩文件有读取权限。

        第2种,当mode为'w'时,表示对压缩文件有写入权限。当文件不存在时,会创建一个空的压缩文件;当文件存在时,写入的内容会覆盖原来的压缩文件内容。

        第3种,当mode为'a'时,表示对压缩文件有写入权限。当文件不存在时,会创建一个空的压缩文件;当文件存在时,会在压缩文件内追加内容,而不会覆盖原来的压缩文件内容。

参数compression: 选择对文件进行压缩的压缩方法,值可以为ZIP_STORED、ZIP_DEFLATED、ZIP_BZIP2、ZIP_LZMA等。

参数allowZip64: 当参数值为True时,类ZipFile将在必要时创建带有.zip64扩展名的文件。

参数compresslevel: 表示压缩级别。当使用ZIP_STORED或ZIP_LZMA压缩方法时,此参数没有作用。当使用ZIP_DEFLATED时,0~9是可以作为参数值的。当使用ZIP_BZIP2时,整数1~9是可以作为参数值的。

当需要读取压缩文件中所包含的文件名称时,可以使用namelist()方法。

示例代码:

import zipfile
z = zipfile.ZipFile('数据3\书代码.zip', 'r')
print(z.namelist())

第2行代码使用类ZipFile读取当前路径下的“数据3\书代码.zip”文件,且以'r'模式读取。返回一个压缩文件对象并赋值给变量z该对象,与使用open()函数打开文件后创建的文件对象相似。

第3行代码使用namelist()方法,可以获取压缩文件对象z中的所有文件名称,并以列表的形式返回。

代码执行结果:

['num1.py', 'num2.py', 'num3.py', 'num4.py']

三、解压文件

将文件进行压缩时需要先创建一个压缩文件对象,再依次将需要压缩的文件添加到压缩文件对象中,可使用write()方法来实现。其使用形式如下:

zipfile.ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)

参数filename: 表示需要添加到压缩文件中的文件名称。

参数arcname: 表示在压缩文件中的文件名称(默认情况下与filename相同)。

参数compress_type: 表示压缩类型(ZIP_STORED、ZIP_DEFLATED、ZIP_BZIP2、ZIP_LZMA)。

参数compresslevel: 表示压缩级别。当使用ZIP_STORED或ZIP_LZMA压缩方法时,此参数没有作用。当使用ZIP_DEFLATED时,0~9是可以作为参数值的。当使用ZIP_BZIP2时,整数1~9是可以作为参数值的。

注意,使用write()方法添加完文件后,必须使用close()方法关闭压缩文件,否则文件无法完成压缩。

示例代码(将两个文件压缩为Zip文件):

import zipfile
z = zipfile.ZipFile('数据3\书代码新.zip', 'w')
z.write(r'数据3\num1.py')
z.write(r'数据3\num2.py')
z.close()

第2行代码以'w'模式创建了一个压缩文件对象z,且压缩文件名为“书代码新.zip”。

第3行代码使用write()方法将“数据3\num1.py”文件添加到压缩文件“书代码新.zip”中。

第4行代码将“数据3\num2.py”也添加到压缩文件“书代码新.zip”中。

第5行代码使用close()方法关闭压缩文件。至此,整个压缩过程完成。

如果需要将整个文件夹中的所有文件都进行压缩,可结合os库中的listdir()方法获取全部文件名,并使用for循环依次将文件添加到压缩文件夹中。

示例代码:

import os, zipfile
z = zipfile.ZipFile('数据3\压缩全.zip', 'w')
for file_name in os.listdir('.\数据3'):
    if file_name != '压缩全.zip':
        z.write('./数据3/' + file_name)
z.close()

四、获取Zip文件中文件的属性信息

如需获取Zip文件中文件的属性,可以通过infolist()函数来实现,其功能为返回Zip文件中每个文件的属性列表。属性信息由类ZipInfo提供。

示例代码(获取Zip文件中文件的属性信息):

import zipfile
z = zipfile.ZipFile('数据3\书代码.zip', 'r')
for f in z.infolist():
    print('文件名:', f.filename, end='\t')
    print('修改时间:', f.date_time, end='\t')
    print('CRC值:', f.CRC, end='\n\t')
    print('压缩后大小:', f.compress_size, end='\t')
    print('压缩前大小:', f.file_size)

第3行代码使用infolist()函数获取Zip文件中每个文件的属性列表,并分别循环遍历每个文件的属性。

第4~8行代码分别用于获取每个文件的filename、date_time、CRC、compress_size和file_size值。其中CRC值是通过算法计算出来的数值,对于不同长度、不同内容的文件,计算出的CRC值各不相同,因此CRC值可以用于验证压缩和解压后的文件数据是否完整,保证压缩前的文件和解压后的文件是相同的。

其代码执行结果如下,其中的信息与图9-11中的属性值相同(图中CRC值以十六进制显示,而代码中print语句默认以十进制输出)。

文件名: num1.py    修改时间: (2022, 9, 8, 0, 50, 36)    CRC值: 2944458753    压缩后大小: 1124   压缩前大小: 3322

文件名: num2.py    修改时间: (2022, 9, 8, 0, 50, 16)    CRC值: 310401716    压缩后大小: 1757压缩前大小: 4846

文件名: num3.py    修改时间: (2022, 9, 7, 17, 13, 6)    CRC值: 1966939407    压缩后大小: 132
压缩前大小: 157

你可能感兴趣的:(小白学Python,压缩和解压文件)