python常用标准库(压缩包模块zipfile和tarfile)

常用的标准库

在我们常用的系统 windowsLinux系统中有很多支持的压缩包格式,包括但不限于以下种类: rarziptar,以下的标准库的作用就是用于压缩解压缩其中一些格式的压缩包。

zip格式

import zipfile

zipfile模块操作压缩包使用 ZipFile类进行操作,使用方法和 open的使用方法很相似,也是使用 rwxa四种操作模式。基本步骤也是大致分为三步:打开文件、操作文件、关闭文件。可以使用with语法进行上下文自动操作。

注意一:zipfile也是rwxa四种模式,表示也会有文件操作中光标指针的概念。

注意二:在Python中,几乎所有涉及到文件相关的操作都是打开、操作、关闭三个步骤。

ZipFile参数说明

语法:ZipFile(file, mode=’r’, compression=ZIP_STORED, allowZip64=True)

参数 含义 file 文件路径 mode 操作含义,与文件操作中相同,默认为r。 compression 压缩方法,默认为ZIP_STORED。 allowZip64 操作的压缩包文件大小大于2G时应该True, 默认为True,不用管它。

操作含义

模式 含义 w 创建一个新的压缩包文件。 r 读取已有的压缩包文件。 a 向已有的压缩包文件中压缩文件。

压缩方法

在上面的compression参数中可以看到,默认的压缩方法为ZIP_STORED。其实在zipfile模块中定义了一些压缩方法常量,其中最常用的为以下两种:

ZIP_STORED = 0  # 打包归档(不压缩)
ZIP_DEFLATED = 8  # 压缩文件(压缩)

请注意,压缩方法指的是用于将文件写入包的方法,因此,如果要解压缩文件,则不需要指定此压缩方法。

[En]

Note that the compression method refers to the method used to write the file to the package, so if you are unzipping the file, there is no need to specify this compression method.

常用方法

write — 指定文件写入压缩包(压缩文件)

语法:write(filename, arcname=None)
语法:write(压缩文件路径,写入压缩包后的路径和名字(默认原名))

如果写入文件是文件夹,则不会将该文件夹的内容一起写入。

[En]

If the write file is a folder, the contents of the folder will not be written together.

close — 关闭对象(保存文件)

这是我要压缩的文件夹。

python常用标准库(压缩包模块zipfile和tarfile)

使用ZIP_STORED压缩。

import zipfile

文件路径
zip_file_path = r'D:\test.zip'  # 压缩包路径
file_path = r'D:\10-中日欧美信息解析'  # 被压缩文件

默认使用ZIP_STORED
zf = zipfile.ZipFile(zip_file_path, 'w')

写入文件(如果写入文件夹,则不会将该文件夹中的文件一起写入)<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Write to a file (if you write to a folder, the files in the folder will not be written together)</font>*</details>
zf.write(file_path)

关闭文件
zf.close()

如您所见,如果直接压缩文件夹,则其中的文件不会一起压缩。

[En]

As you can see, if the folder is compressed directly, the files in it will not be compressed together.

python常用标准库(压缩包模块zipfile和tarfile)

让文件夹中的所有文件都迭代到包中。

[En]

Let all files in the folder be iterated into the package.

import os
import zipfile

def writeZip(zf, file, arc_path=None):
    """迭代压缩文件夹"""
    # 设置压缩路径
    if arc_path is None:
        arc_path = rf'\{os.path.basename(file)}'

    # 先压缩本文件
    zf.write(file, arc_path)

    # 如果是文件夹
    if os.path.isdir(file):

        # 获取它所有的子文件
        inner_files = os.listdir(file)

        # 将所有的子文件压缩
        for inner_file in inner_files:
            inner_file = f'{file}{os.sep}{inner_file}'
            arc = fr'{arc_path}\{os.path.basename(inner_file)}'
            writeZip(zf, inner_file, arc)

文件路径
zip_file_path = r'D:\test.zip'  # 压缩包路径
file_path = r'D:\10-中日欧美信息解析'  # 被压缩文件

默认使用ZIP_STORED
zf = zipfile.ZipFile(zip_file_path, 'w')

写入文件(自定义函数,迭代以压缩文件夹)<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Write to a file (customize a function, iterate to compress the folder)</font>*</details>
writeZip(zf, file_path)

关闭文件
zf.close()

现在就可以看到,虽然所有的文件已经全部写入压缩包中,但是ZIP_STORED方法并没有压缩文件。

python常用标准库(压缩包模块zipfile和tarfile)

python常用标准库(压缩包模块zipfile和tarfile)

改用ZIP_DEFLATED方法压缩文件。

import os
import zipfile

def writeZip(zf, file, arc_path=None):
    """迭代压缩文件夹"""
    # 设置压缩路径
    if arc_path is None:
        arc_path = rf'\{os.path.basename(file)}'

    # 先压缩本文件
    zf.write(file, arc_path)

    # 如果是文件夹
    if os.path.isdir(file):

        # 获取它所有的子文件
        inner_files = os.listdir(file)

        # 将所有的子文件压缩
        for inner_file in inner_files:
            inner_file = f'{file}{os.sep}{inner_file}'
            arc = fr'{arc_path}\{os.path.basename(inner_file)}'
            writeZip(zf, inner_file, arc)

文件路径
zip_file_path = r'D:\test.zip'  # 压缩包路径
file_path = r'D:\10-中日欧美信息解析'  # 被压缩文件

使用ZIP_DEFLATED压缩
zf = zipfile.ZipFile(zip_file_path, 'w', zipfile.ZIP_DEFLATED)

写入文件(自定义函数,迭代以压缩文件夹)<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Write to a file (customize a function, iterate to compress the folder)</font>*</details>
writeZip(zf, file_path)

关闭文件
zf.close()

如您所见,该文件是在内部压缩和写入的。

[En]

As you can see, the file is compressed and written internally.

python常用标准库(压缩包模块zipfile和tarfile)

python常用标准库(压缩包模块zipfile和tarfile)
解压缩

解压缩有如下两种方法,注意,解压缩就是在读文件,要将操作模式变更为 r

方法 说明 extract 解压缩单个指定的文件。 extractall 解压缩所有的文件。

语法:extract(member,path=None, pwd=None)
语法:extract(指定文件(压缩包中的路径),解压到的位置(默认为当前工作目录),指定的密码(有些压缩包有密码,格式为字节流))

语法:extractall(path=None, pwd=None)
语法:extractall(解压到的位置, 密码)

注意:解压缩后的文件和路径中具有相同名称的文件夹将报告错误,因为该文件无法重置文件夹。

[En]

Note: the unzipped file and the folder in the path with the same name will report an error because the file cannot reset the folder.

namelist — 迭代返回压缩包中的文件
import zipfile

with zipfile.ZipFile(r'D:\test.zip') as zf:
    res = zf.namelist()
    print(res)
    # ['10-中日欧美信息解析/', '10-中日欧美信息解析/1-代码/', ...]
infolist — 迭代返回压缩包中的文件信息

比如文件的权限等。

printdir — 查看压缩包中的文件的信息

查看包中的文件信息,如文件大小、创建日期等。默认情况下查看所有文件。

[En]

View the file information in the package, such as the file size, creation date, and so on. View all files by default.

语法:printdir(file=None)

tar包 和 gz、bz2、xz格式

import tarfile

tarfile的使用和文件操作更加的相似,只是在压缩模式上略有不同。

使用linux系统的朋友都知道,tar是Linux的一种打包方式,打包成为tar包之后,才可以使用其它的压缩程序去压缩。最常用的压缩方式是gzip,压缩率最高的方式bzip2,此外还支持另一种比较小众的xzip格式。

主要操作方法为 tarfile.TarFile.open(),可以直接 tarfile.open()

语法:open(name, mode=’r’)

当初在学习的时候,老师还教有encoding=’UTF-8’参数,但是文件操作要什么编码格式?感觉他是为了方便直接从文件操作的代码上直接复制过来的,然后没有删掉。

操作tar包

模式为 rwax四种为主,外加使用add方法写入文件,退出依然使用close方法。

add(name, arcname)
add(压缩文件,压缩别名)
请注意,压缩别名不得以路径分隔符结尾,否则将只创建一个文件夹。

[En]

Note that the compressed alias must not end with a path delimiter, or only one folder will be created.

import tarfile

with tarfile.open('test.tar', 'w') as tf:
    tf.add('test.txt')
压缩

压缩的方式主要是将模式改变,在 rwx的基础上加上各个压缩的方式,变成: r:gzw:bz2x:xz等样式,然后在将刚才创建的tar包压缩,当然也可以直接将文件压缩成为压缩包。

注意, a模式不能配备任何压缩模式,因为gzip、bzip2、xzip不能直接往里面追加文件,所以如果要追加文件,将tar包解压缩出来,然后追加再压缩。

import tarfile

tar包以gzip格式压缩
with tarfile.open('test.tar.gz', 'w:gz') as tf:
    tf.add('test.tar')
解压缩

tarfile的解压缩方法和zipfile的一模一样。

方法 含义 extract 解压缩指定文件 extractall 解压缩所有文件

getnames — 返回压缩包中的文件(list)

删除压缩包中的文件

zipfile和tarfile不支持删除压缩包中的文件,所以如果有需要删除压缩包中的文件,可以将压缩包解压出来,然后删除其中的文件,再压缩。

Original: https://www.cnblogs.com/msr20666/p/16377769.html
Author: 小小垂髫
Title: python常用标准库(压缩包模块zipfile和tarfile)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/499377/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球