当前位置: 代码网 > it编程>前端脚本>Python > python处理常见格式压缩包文件的全指南

python处理常见格式压缩包文件的全指南

2025年05月09日 Python 我要评论
1.7z压缩包安装py7zr库pip install py7zr解压.7z文件以下示例代码将一次性把"f:/ticks/test.7z"压缩文件里面的所有文件一一按照原文件层次结构

1.7z压缩包

安装py7zr库

pip install py7zr

解压.7z文件

以下示例代码将一次性把"f:/ticks/test.7z"压缩文件里面的所有文件一一按照原文件层次结构递归解压到"f:/ticks/test"目录下。注意,如果xxx.7z里面包含有压缩文件,将不会解压。

import py7zr
 
def un_7z(file_7z_path):
    save_dir = file_7z_path[:file_7z_path.rfind(".7z")]
    archive = py7zr.sevenzipfile(file_7z_path, mode='r')
    archive.extractall(path=save_dir)
    archive.close()
 
if __name__ == "__main__":
    filepath = "f:/ticks/test.7z"
    un_7z(filepath)

源文件夹目录结构

解压后是保持一致的

py7zr (v0.6及更高版本) 也提供了上下文管理,所以可以使用 with 代码块:

import py7zr
 
with py7zr.sevenzipfile('sample.7z', mode='r') as z:
    z.extractall()

py7zr 还支持提取单个或通过 extract(targets=[‘file path’]) 选特定的多个文件进行解压。注意:如果只指定文件而不指定父目录,将会提取失败。

import py7zr
import re
 
filter_pattern = re.compile(r'<your/target/file_and_directories/regex/expression>')
with sevenzipfile('archive.7z', 'r') as archive:
    allfiles = archive.getnames()
    selective_files = [f for f in allfiles if filter_pattern.match(f)]
    archive.extract(targets=selective_files)

py7zr(v0.6及更高版本)支持提取受密码保护的归档文件。

import py7zr
 
with py7zr.sevenzipfile('encrypted.7z', mode='r', password='secret') as z:
    z.extractall()

压缩为.7z文件

下面是一段如何生成归档文件的示例代码

import py7zr
 
with py7zr.sevenzipfile('target.7z', 'w') as archive:
    archive.writeall('/path/to/base_dir', 'base')
 
with py7zr.sevenzipfile('target.7z', 'w') as z:
    z.writeall('./base_dir')

要创建加密存档,请传递密码

import py7zr
 
with py7zr.sevenzipfile('target.7z', 'w', password='secret') as archive:
    archive.writeall('/path/to/base_dir', 'base')

要使用zstandard等算法创建存档,可以使用自定义过滤器调用。

import py7zr
 
my_filters = [{"id": py7zr.filter_zstd}]
another_filters = [{"id": py7zr.filter_arm}, {"id": py7zr.filter_lzma2, "preset": 7}]
with py7zr.sevenzipfile('target.7z', 'w', filters=my_filter) as archive:
    archive.writeall('/path/to/base_dir', 'base')

7z压缩包分卷的解压缩

①分卷长什么样

正常情况下是把文件夹filename压缩为filename.7z压缩包,但7z也提供了用分卷的形式,比如11个分卷

filename.7z.001,filename.7z.002,filename.7z.003,filename.7z.004,.......,filename.7z.011

7z.001这类文件是7z格式文件简单分割出的

②如何手动解压分卷形式的压缩包

要将全部分卷放在同一个目录下,然后解压filename.7z.001即可,如果filename.7z.001所在目录下缺少部分分卷,则会无法解压或者解压失败

③如何将分卷压缩包合并为7z压缩包文件

linux环境下

进入分卷所在文件夹,使用指令

cat {文件名1} {文件名2} {文件名n} > {生成文件名}

下以文件名 shapenetp2m.7z为例,执行如下命令:

cat shapenetp2m.7z-001.001 shapenetp2m.7z-002.002 shapenetp2m.7z-003.003 >shapenetp2m.7z

[root@localhost 7ztest]# ls
bondtick.7z.001  bondtick.7z.002  bondtick.7z.003  bondtick.7z.004  bondtick.7z.005  bondtick.7z.006  bondtick.7z.007  bondtick.7z.008  bondtick.7z.009  bondtick.7z.010  bondtick.7z.011
[root@localhost 7ztest]# cat * > bondtick.7z

windows环境下

1、在g:\downloads\test目录中有一批test.7z.00x分卷压缩文件(后缀一般为001-00x)。

2、首先使用快捷键“win+r”弹出运行命令框,输入:cmd,打开命令行窗口。

3、输入:cd /d g:\downloads\test,进入7z分卷文件目录中。

4、然后输入:copy /b test.7z.* test.7z。

5、成功后就会在当前目录看到一个test.7z文件(7z后缀)

2.tar和gz压缩包

安装相关包

python自带的tarfile模块可以方便读取tar归档文件,牛b的是可以处理使用gzip和bz2压缩归档文件tar.gz和tar.bz2。

tarfile包常用函数

①tarfile.open

创建tar文件对象

tarfile.open(name=none,mode='r',fileobj=none,bufsize=10240,**kwargs)

mode的值有:

  • 'r' or 'r:*'   open for reading with transparent compression (recommended).
  • 'r:'   open for reading exclusively without compression.
  • 'r:gz'   open for reading with gzip compression.
  • 'r:bz2'   open for reading with bzip2 compression.
  • 'a' or 'a:'   open for appending with no compression. the file is created if it does not exist.
  • 'w' or 'w:'   open for uncompressed writing.
  • 'w:gz'   open for gzip compressed writing.
  • 'w:bz2'   open for bzip2 compressed writing.

②tar.close()

关闭文件对象

③tar.add(filepath)

将文件filepath添加到压缩包文件中

④tar.getnames()

获取压缩包里的全部目录和文件路径,返回列表,比如压缩包是linux环境下的某个压缩包,压缩时某个文件路径是"/home/tick/test/20230510/601669_snap.csv",则返回列表里的某个元素就是"/home/pjzy003/test/20230510/601669_snap.csv"

⑤tar.extract(file_name, target_dir)

将压缩包文件中的文件file_name解压到target_dir中,最终解压后的文件路径或者目录路径为target_dir+file_name

  • 比如target_dir="d:\xxx\yyy",file_name="test\20230510",则新生成的文件夹为"d:\xxx\yyy\test\20230510"
  • 比如target_dir="d:/xxx/yyy",file_name="/home/tick/test/20230510/601669_snap.csv",则新生成的文件为"d:/xxx/yyy/home/tick/test/20230510/601669_snap.csv"

注意:tar.extract函数的第一个参数必须传入tar.getnames()这个函数返回的列表里的元素

压缩为tar.gz文件

import os
import tarfile
 
if __name__ == "__main__":
    dir_path = r"d:\pythontest\20220510"
    tar_gz_path = f"{dir_path}.tar.gz"
    
    # 1.创建tar文件对象
    tar = tarfile.open(tar_gz_path, "w:gz")
    
    # 2.将子目录和文件添加到tar对象中
    for root, dirs, files in os.walk(dir_path):
        # 2.1先将目录添加到压缩包中
        tar.add(root)
        
        # 2.2再将目录下的文件添加到压缩包中
        for file in files:
            fullpath = os.path.join(root, file)
            tar.add(fullpath)
    
    # 3.关闭tar对象
    tar.close()

解压tar.gz文件

用法示例

import os
import tarfile
 
if __name__ == "__main__":
    tar_gz_path = r"d:\pythontest\test\20220510.tar.gz"
    # 以下代码将tar.gz文件解压到了同级目录下
    # 比如d:\pythontest\test\20220510.tar.gz
    # 解压后产生d:\pythontest\test\20220510
    
    # 处理路径信息
    tar_gz_path = tar_gz_path.replace("\\", "/")
    tar_gz_dir = tar_gz_path[:tar_gz_path.rfind("/")]
    tar_gz_name = tar_gz_path[tar_gz_path.rfind("/")+1:]
    dir_name = tar_gz_name[:-7]
    
    # 创建tar文件对象
    tar = tarfile.open(tar_gz_path, "r:gz")
    
    # 获取压缩包下的所有子目录和文件路径
    file_names = tar.getnames()
    print(file_names)
 
    # 解压
    for file_name in file_names:
        print("=============")
        print("file_name:", file_name)   
        pre_name = file_name[:file_name.rfind(dir_name)-1]
        print("pre_name:", pre_name)     
        save_dir = tar_gz_dir[:tar_gz_dir.rfind(pre_name)]
        print("save_dir:", save_dir)    
        tar.extract(file_name, save_dir)
    
    # 关闭tar对象
    tar.close()

将其封装为函数。与示例相比,这里的函数处理了文件路径的细节问题,比如压缩的路径"d:\data\20230510.tar.gz",压缩包里面的文件路径是"/home/tick/test/20230510/601669_snap.csv",则解压后的文件路径是"d:/data/20230510/home/tick/test/20230510/601669_snap.csv",但是我们想要的是"d:/data/20230510/601669_snap.csv"这种效果,因此需要处理,具体见下方代码。

import os
import shutil
import tarfile
 
def un_tar_gz(gz_file_path):
    """
    :param gz_file_path: tar.gz文件路径,比如d:/pythontest/test/20220510.tar.gz
    :return: none
    函数作用:
        将tar.gz文件解压到了同级目录下
        比如d:/pythontest/test/20220510.tar.gz解压后产生d:/pythontest/test/20220510
    """
    # 判断传输的文件类型是否正确
    if gz_file_path[-7:] != ".tar.gz":
        print(f"{gz_file_path} not tar.gz type")
        return none
    
    # 若文件不存在
    if not os.path.exists(gz_file_path):
        print(f"{gz_file_path} not exists")
        return none
    
    # 处理路径信息
    tar_gz_path = gz_file_path.replace("\\", "/")
    tar_gz_dir = tar_gz_path[:tar_gz_path.rfind("/")]
    tar_gz_name = tar_gz_path[tar_gz_path.rfind("/") + 1:]
    tar_gz_name_pre = tar_gz_name[:-7]
    save_dir = tar_gz_dir + "/" + tar_gz_name_pre
    save_dir_temp = save_dir + "_temp"
    
    # 创建tar文件对象
    tar = tarfile.open(tar_gz_path, "r:gz")
    
    # 获取压缩包下的所有子目录和文件路径
    file_names = tar.getnames()
    # print(file_names)
    
    # 解压,解压后的文件名为 save_dir + file_name
    for file_name in file_names:
        tar.extract(file_name, save_dir_temp)
    
    # 关闭tar对象
    tar.close()
    
    # 创建同级目录
    if not os.path.exists(save_dir):
        os.mkdir(save_dir)
    
    # 将解压后的文件移动到同级目录下
    for file_name in file_names:
        temp_file_path = save_dir_temp+"/"+file_name
        start_index = file_name.rfind(tar_gz_name_pre) + len(tar_gz_name_pre)
        final_file_path = save_dir+"/"+file_name[start_index:]
        if not os.path.exists(final_file_path):
            if os.path.isdir(temp_file_path):
                os.mkdir(final_file_path)
            else:
                shutil.move(temp_file_path, final_file_path)
    
    # 删除临时目录
    if os.path.exists(save_dir_temp):
        shutil.rmtree(save_dir_temp)
 
if __name__ == "__main__":
    gz_path = r"d:\pythontest\test\20220510.tar.gz"
    un_tar_gz(gz_path)

将tar.gz解压tar文件

import gzip
 
def ungz(filename):
    filename = filename[:-3] 
    # gz文件的单文件解压就是去掉 filename 后面的 .gz
    gz_file = gzip.gzipfile(filename)
    with open(filename, "w+") as file:
        file.write(gz_file.read())
        return filename  # 这个gzip的函数需要返回值以进一步配合untar函数

解压tar文件

import tarfile
 
def untar(filename):
    tar = tarfile.open(filename)
    names = tar.getnames()
    # tar本身是将文件打包,解除打包会产生很多文件,因此需要建立文件夹存放
    if not os.path.isdir(filename + "_dir"):
        os.mkdir(filename + "_dir")
    for name in names:
        tar.extract(name, filename + "_dir/")
    tar.close()

3.zip类压缩包

使用zipfile模块

import zipfile
 
def unzip(filename):
    zip_file = zipfile.zipfile(filename)
    # 类似tar解除打包,建立文件夹存放解压的多个文件
    if not os.path.isdir(filename + "_dir"):
        os.mkdir(filename + "_dir")
    for names in zip_file.namelist():
        zip_file.extract(names, filename + "_dir/")
    zip_file.close()

4.处理.rar文件

使用rarfile包

import rarfile
import os
 
def unrar(filename):
    rar = rarfile.rarfile(filename)
    if not os.path.isdir(filename + "_dir"):
        os.mkdir(filename + "_dir")
    os.chdir(filename + "_dir")  # 改变当前工作路径
    rar.extractall()   # 将全部文件解压到当前工作路径
    rar.close()

以上就是python处理常见格式压缩包文件的全指南的详细内容,更多关于python处理压缩包文件的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com