> 文档中心 > Python3,9行代码进行压缩和解压缩,从此告别压缩软件。

Python3,9行代码进行压缩和解压缩,从此告别压缩软件。

9行代码进行压缩和解压缩

  • 1、引言
  • 2、代码实例
    • 2.1 zip文件
    • 2.2 tar.gz文件
      • 2.2.1 基本信息
      • 2.2.2 代码示例
    • 2.3 rar文件
      • 2.3.1 安装
      • 2.3.2 代码示例
    • 2.4 7z文件
  • 3、总结

1、引言

小屌丝:鱼哥,你电脑有没有7-Zip?
小鱼:没有!
小屌丝:winRAR 呢?
小鱼:没有!
小屌丝:360 呢?
小鱼:也没有。
小屌丝:那你如何解压软件?
小鱼:zipfile,tarfile和rarfile。
在这里插入图片描述
小屌丝:鱼哥,那你share一下呗
小鱼:晒一晒??
小屌丝:嗯,晒一晒。

2、代码实例

在日常的工作中,我们很多时候都需要对文件/安装软件进行压缩,
但是,由于现在各种各样的压缩、解压缩软件太多,
而有些解压缩软件又不是在正规的(你懂得…),一不小心,就会踩雷。
所以,为了社会的和谐,必要的时候,还可以自己搞几行代码,来对文件进行压缩和解压缩,而今天,我们就来对这三种文件进行压缩和解压缩:

  • zip文件
  • tar.gz文件
  • rar文件
  • 7z文件

2.1 zip文件

说道zip文件压缩和解压缩,小鱼在《Python3:9行代码帮助小姐姐找回压缩包密码,而小姐姐的回报,让我害羞了~ ~》博文详细介绍过解压缩方法。
这里用到的就是ZipFile这个方法。
代码示例

# -*- coding:utf-8 -*-# @Time   : 2022-04-05# @Author : carl_DJimport  osimport zipfile'''压缩文件'''def make_zip(source_path,output_filename):    zip_file = zipfile.ZipFile(output_filename,'w')    pre_len = len(os.path.dirname(source_path))    for parent,dirnames,filenames in os.walk(source_path): for filename in filenames:     print(f'{filename}')     path_file = os.path.join(parent,filename)     arcname = path_file[pre_len:].strip(os.path.sep)     zip_file.write(path_file,arcname)    zip_file.close()'''解压缩文件'''def decompression_zip(file_name):    zip_file = zipfile.ZipFile(file_name)    if os.path.isdir(file_name + '_files'): pass    else: os.mkdir(file_name + '_files')    for names in zip_file.namelist(): zip_file.extract(names,file_name + '_files/')    zip_file.close()if __name__ == '__main__':    make_zip(r"D:\phps_pro",'demo_test.zip')    decompression_zip("demo_test.zip")    

2.2 tar.gz文件

2.2.1 基本信息

tarfile 模块可以用来读写 tar 归档,包括使用 gzip, bz2 和 lzma 压缩的归档。
在使用tarfile是必须了解模式:

**mode 必须是 ‘filemode[:compression]’ 形式的字符串,其默认值为 ‘r’,
**,详细参照下表:

mode action
‘r’ or ‘r:*’ 打开和读取使用透明压缩(推荐)
‘r:’ 打开和读取不使用压缩
‘r:gz’ 打开和读取使用gzip 压缩。
‘r:bz2’ 打开和读取使用bzip2 压缩。
‘r:xz’ 打开和读取使用lzma 压缩。
‘x’ 或 ‘x:’ 创建tarfile不进行压缩。如果文件已经存在,则抛出 FileExistsError 异常。
‘x:gz’ 使用gzip压缩创建tarfile。如果文件已经存在,则抛出 FileExistsError 异常。
‘x:bz2’ 使用bzip2 压缩创建tarfile。如果文件已经存在,则抛出 FileExistsError 异常。
‘x:xz’ 使用lzma 压缩创建tarfile。如果文件已经存在,则抛出 FileExistsError 异常。
‘a’ or ‘a:’ 打开以便在没有压缩的情况下追加。如果文件不存在,则创建该文件。
‘w’ or ‘w:’ 打开用于未压缩的写入。
‘w:gz’ 打开用于 gzip 压缩的写入。
‘w:bz2’ 打开用于 bzip2 压缩的写入。
‘w:xz’ 打开用于 lzma 压缩的写入

针对特殊的目的,还存在第二种 mode 格式: ‘filemode|[compression]’。
tarfile.open() 将返回一个将其数据作为数据块流来处理的 TarFile 对象:

mode action
‘rI* ’ 打开 tar 块的 流 以进行透明压缩读取。
‘rI’ 打开一个未压缩的 tar 块的 stream 用于读取。
‘rIgz’ 打开一个 gzip 压缩的 stream 用于读取。
‘rIbz2’ 打开一个 bzip2 压缩的 stream 用于读取。
‘rIxz’ 打开一个 lzma 压缩 stream 用于读取。
‘wI’ 打开一个未压缩的 stream 用于写入。
‘wIgz’ 打开一个 gzip 压缩的 stream 用于写入。
‘wIbz2’ 打开一个 bzip2 压缩的 stream 用于写入。
‘wIxz’ 打开一个 lzma 压缩的 stream 用于写入。

2.2.2 代码示例

代码示例

# -*- coding:utf-8 -*-# @Time   : 2022-04-05# @Author : carl_DJimport osimport tarfileimport gzip'''tar.gz文件  压缩和解压缩'''# 一次性打包整个根目录。空子目录会被打包。# 如果只打包不压缩,将"w:gz"参数改为"w:"或"w"即可。def make_targz(output_filename, source_dir):    with tarfile.open(output_filename, "w:gz") as tar: tar.add(source_dir, arcname=os.path.basename(source_dir))# 逐个添加文件打包,未打包空子目录。可过滤文件。# 如果只打包不压缩,将"w:gz"参数改为"w:"或"w"即可。def make_targz_one_by_one(output_filename, source_dir):    tar = tarfile.open(output_filename, "w:gz")    for root, dir, files in os.walk(source_dir): for file in files:     pathfile = os.path.join(root, file)     tar.add(pathfile)    tar.close()#解压缩gz文件def decompression_gz(file_name): f_name = file_name.replace(".gz", "")    # 获取文件的名称,去掉    g_file = gzip.GzipFile(file_name)    # 创建gzip对象    open(f_name, "wb+").write(g_file.read())    # gzip对象用read()打开后,写入open()建立的文件里。    g_file.close()  # 关闭gzip对象def decompression_tar(file_name):    # untar zip file    tar = tarfile.open(file_name)    names = tar.getnames()    if os.path.isdir(file_name + "_files"): pass    else: os.mkdir(file_name + "_files")    # 由于解压后是许多文件,预先建立同名文件夹    for name in names: tar.extract(name, file_name + "_files/")    tar.close()if __name__ == '__main__':    make_targz('test.tar.gz', "D:")    make_targz_one_by_one('test01.tgz', "D:\phps_pro")    decompression_tar("demo_test.tar")    decompression_gz("demo_test.tar.gz")    

2.3 rar文件

2.3.1 安装

我们可以使用rarfile来解压.rar的文件,
但是,不支持用rarfile来压缩rar文件。
敲黑板,
因为Python下的 unrar 还依赖了RAR官方的库,所以咱们不能直接pip install unrar,否则会报错。

我们就需要另行安装,Windows为例:

  • 到RARLab官方下载库文件,https://www.rarlab.com/rar/UnRARDLL.exe,然后安装。
  • 安装是最好选择默认路径,一般在 C:Program Files (x86)UnrarDLL 目录下。
  • 添加环境变量,在系统变量中新建变量名UNRAR_LIB_PATH,如果是64位系统,就输入 C:Program Files (x86)UnrarDLLx64UnRAR64.dll,如果是32位系统就是 C:Program Files (x86)UnrarDLLUnRAR.dll。
  • 确定保存环境变量后,在进行 pip install unrar 安装,这时代码再运行就不会报错了。

2.3.2 代码示例

代码示例

# -*- coding:utf-8 -*-# @Time   : 2022-04-05# @Author : carl_DJimport rarfile#解压缩rardef  decompression_rar(rar_file, dir_name):#rarfile需要unrar支持,windows下在winrar文件夹找到unrar,加到path里rarobj = rarfile.RarFile(rar_file.decode('utf-8'))    rarobj.extractall(dir_name.decode('utf-8'))    

2.4 7z文件

要压缩和解压缩.7z文件需要用到py7zr组件。

代码示例

# -*- coding:utf-8 -*-# @Time   : 2022-04-05# @Author : carl_DJimport py7zr'''压缩7z'''with py7zr.SevenZipFile("Archive.7z", 'r') as archive:    archive.extractall(path="/tmp")'''解压缩7z'''with py7zr.SevenZipFile("Archive.7z", 'w') as archive:    archive.writeall("target/")    

3、总结

今天的分享,就到这里了。
奇奇怪怪的知识,又增加了。
以后是不是就不用再去下载第三方的压缩软件了,
直接执行个代码就OK了。

关注小鱼,学习更多关于python第三方库的知识。