压缩自定义格式压缩包<2>:python使用DEFLATE 算法打包并解压成功,但是解压后的文件格式是固定后缀。

打包

import zlib
import os

def compress_folder(input_folder, output_filename):
    """
    使用 DEFLATE 算法压缩文件夹下的所有文件。

    Parameters:
        input_folder: str
            要压缩的文件夹路径。
        output_filename: str
            输出压缩文件名。
    """
    # 创建一个空的字节串,用于存储所有文件的压缩数据
    compressed_data = bytearray()

    # 遍历文件夹下的所有文件
    for root, dirs, files in os.walk(input_folder):
        for file in files:
            # 构建文件的完整路径
            file_path = os.path.join(root, file)
            # 读取文件内容
            with open(file_path, 'rb') as f:
                file_data = f.read()
                # 使用 DEFLATE 算法压缩文件内容
                compressed_data += zlib.compress(file_data)

    # 将所有文件的压缩数据写入到输出文件中
    with open(output_filename, 'wb') as f_out:
        f_out.write(compressed_data)
		
# 指定要压缩的文件夹路径和输出文件名
input_folder = 'D:/soft/AI/workspace/packagetest/package'
output_filename = 'D:/soft/AI/workspace/packagetest/package.pg'

# 执行压缩操作
compress_folder(input_folder, output_filename)

解压

import zlib
import os
import struct

def compress_folder(input_folder, output_filename):
    compressed_data = bytearray()

    for root, dirs, files in os.walk(input_folder):
        for file in files:
            file_path = os.path.join(root, file)
            with open(file_path, 'rb') as f:
                file_data = f.read()
                compressed_block = zlib.compress(file_data)
                compressed_data += struct.pack('<I', len(compressed_block)) + compressed_block

    with open(output_filename, 'wb') as f_out:
        f_out.write(compressed_data)

def decompress_folder(input_filename, output_folder):
    with open(input_filename, 'rb') as f_in:
        compressed_data = f_in.read()

    offset = 0
    file_counter = 1  # 用于生成唯一文件名

    while offset < len(compressed_data):
        # 每个压缩块的长度信息(4字节)
        block_length = struct.unpack('<I', compressed_data[offset:offset+4])[0]
        offset += 4

        # 解压缩块的数据
        compressed_block = compressed_data[offset:offset+block_length]
        offset += block_length

        # 解压缩数据
        try:
            decompressed_data = zlib.decompress(compressed_block)
        except zlib.error as e:
            print(f"解压缩块 {file_counter} 失败:{e}")
            continue

        # 生成唯一文件名
        file_name = f"file_{file_counter}.dat"
        file_counter += 1

        # 写入文件
        file_path = os.path.join(output_folder, file_name)
        with open(file_path, 'wb') as f_out:
            f_out.write(decompressed_data)

if __name__ == "__main__":
    input_folder = 'D:/soft/AI/workspace/packagetest/package'
    output_filename = 'D:/soft/AI/workspace/packagetest/package.pg'
    output_folder = 'D:/soft/AI/workspace/packagetest/extracted'

    try:
        # 检查并创建目标文件夹
        if not os.path.exists(output_folder):
            os.makedirs(output_folder)

        # 压缩文件夹
        compress_folder(input_folder, output_filename)

        # 解压缩文件夹
        decompress_folder(output_filename, output_folder)

        print("操作成功!")
    except Exception as e:
        print(f"操作失败:{e}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/449054.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构绪论

数据元素&#xff1b;数据项&#xff1b;组合项 数据对象 有相同性质的数据元素就属于同一个数据对象&#xff1b; 而数据结构则要求数据元素之间存在特定的关系&#xff01; 线性数据结构&网状数据结构 数据结构这门课关注的是数据元素之间的关系&#xff0c;和对这些…

做抖音小店需要交钱吗?有门槛吗?都有哪些入驻条件和费用?

大家好&#xff0c;我是电商花花。 在抖音上开店已经成为很多人追逐的方向&#xff0c;因为这些人都看到别人在抖音上赚到钱&#xff0c;然后也想在抖音上尝试一下。 然而&#xff0c;许多人心中仍然存着一个问题&#xff0c;就是做抖音小店需要交钱吗&#xff1f;是否存在门…

盛元广通粮油质量检测实验室管理系统

近年来对于食品安全问题层出不穷&#xff0c;为提高粮食检测中心管理水平&#xff0c;关系到千千万万的消费者的健康饮食问题&#xff0c;粮油作为老百姓日常生活饮食必需品、消耗品&#xff0c;需从源头上对粮食在本省&#xff08;区、市、县&#xff09;不同粮食品种检测检测…

WorkPlus Meet提供高效、安全视频会议解决方案

WorkPlus Meet是一款私有部署和定制化的视频会议解决方案&#xff0c;为企业提供高效、安全的远程协作平台。随着全球数字化转型的加速&#xff0c;视频会议已成为企业必不可少的工作工具&#xff0c;而WorkPlus Meet的私有部署和定制化功能&#xff0c;为企业提供了更大的控制…

KIF本地密钥注入验证步骤 RSA加解密 python JAVA

**验证步骤&#xff1a;** # 终端随机生成一对RSA key pair pem文件 # 终端把sn及公钥发过去 # KIF返回公钥加密后的IPEK及明文IPEK的KCV &#xff08;加密机处理加密等操作&#xff1a;把sn和Base Derivation Key分散生成IPEK用加密机的Local Master Key存入加密机&#xff0c…

面试官:说说你对事件循环的理解

一、事件循环是什么 首先&#xff0c;JavaScript是一门单线程的语言&#xff0c;意味着同一时间内只能做一件事&#xff0c;但是这并不意味着单线程就是阻塞&#xff0c;而实现单线程非阻塞的方法就是事件循环 在JavaScript中&#xff0c;所有的任务都可以分为 同步任务&#…

鸿蒙操作系统 HarmonyOS 3.2 API 9 Stage模型通过ArkTS接入高德地图

用鸿蒙ArkTS语言开发地图APP应用时&#xff0c;很多地图厂商只接入了鸿蒙Java&#xff0c;ArkTS版本陆续接入中&#xff0c;等一段时间才能面世&#xff0c;当前使用地图只能通过鸿蒙的Web组件&#xff0c;将HTML页面嵌入到鸿蒙APP中。具体方法如下&#xff1a;编写HTML <!…

STM32寄存器总结

stm32f10x.h AFIO AFIO->MAPR |= (0<<26)|(1<<25)|(0<<24)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<0); 复用重映射和调试I/O配置寄存器(AFIO_MAPR) 地址偏移:0x04 复位值:0x0000 0000 第24-26位: 设置值:010 说明: …

初学Vue——打包部署Vue前端静态资源

0 引言 我们的前端工程开发好了&#xff0c;但是我们需要发布&#xff0c;那么如何发布呢&#xff1f;主要分为2步&#xff1a; 前端工程打包 通过nginx服务器发布前端工程 在完成Vue项目后&#xff0c;我们需要将项目部署到服务器中&#xff0c;才能够在互联网中访问。这里…

do while循环、嵌套循环、数组简介

本文参考C Primer Plus进行学习 文章目录 出口循环条件&#xff1a;do while如何选择循环嵌套循环数组简介 在for循环中使用数组 一.出口循环条件&#xff1a;do while 出口循环条件&#xff0c;即在循环的每次迭代之后检查测试条件&#xff0c;这保证了至少执行循环体中的内容…

《互联网的世界》第六讲-去中心化和安全

互联网构建于开放互联的中立原则之上&#xff0c;公平接入&#xff0c;数据互联互通&#xff0c;流量被无差别对待&#xff0c;这意味着互联网本质上是匿名&#xff0c;去中心的&#xff0c;这与我们的现实世界完全不同。 但互联网上的主流业务却是 c/s 产销模式&#xff0c;试…

【教程】APP备案全攻略:确保你的应用合规上线

【教程】APP备案全攻略&#xff1a;确保你的应用合规上线 摘要 本文详细介绍了中国大陆地区互联网信息服务提供者&#xff08;AP&#xff09;进行APP备案的流程、要求和注意事项。包括备案对象、备案方式、备案内容、备案流程等方面的详细说明&#xff0c;帮助开发者顺利完成…

sensitive-word 敏感词 违规文字检测

1、快速开始 - JDK1.7- Maven 3.x 2、Maven 引入 <!-- https://mvnrepository.com/artifact/com.github.houbb/sensitive-word --><dependency><groupId>com.github.houbb</groupId><artifactId>sensitive-word</artifactId><version…

基于PLC除尘设备控制系统的设计

摘要 工业作为我国第二支柱产业&#xff0c;在近十几年来发展非常迅速&#xff0c;虽然带了了可观的经济效益&#xff0c;但在工业生产中所产生的大量粉尘气体对大气的污染现象也不容忽视。为减少工业粉尘对环境的污染&#xff0c;世界各国制定了严格的环境保护要求。为了减少…

金山办公内推

作为金山办公刚刚校招等待入职的一员&#xff0c;我诚挚地邀请您加入我的内推计划&#xff0c;与我一起共同打造卓越的工作环境和未来。 我能帮你 &#xff08;与直接填我的内推码不同&#xff0c;我直接通过内部问卷帮你投&#xff09; 1&#xff0c;直接通过校招群里的连接…

异步编程和asyncio

介绍异步编程的重要性和在Python中的应用&#xff0c;特别是在I/O密集型任务和网络编程场景下。 目录 理解异步编程 异步编程基本概念 任务与Future 异步编程的工作原理 事件循环 协程&#xff08;Coroutines&#xff09; 异步与同步代码的结合 深入asyncio模块 事件循…

数据库查询操作

数据库查询操作 数据准备查询的基本操作查询部分字段的值取别名去重 条件查询比较运算符逻辑运算符模糊查询范围查询为空判断 排序分组聚合count(*) : 求表的总的记录数max(字段名): 查询对应字段的最大的值min(字段名): 查询对应字段的最小的值sum(字段名): 查询对应字段的值的…

宝塔 Let‘s Encrypt 该帐户1小时内失败的订单次数超过5次,解决办法

今日用宝塔申请SSL证书时候提示失败&#xff1a;内容如下 {x} 我信了&#xff0c;当我等了一个小时&#xff0c;再次申请时候依然是同样的错误 {x} 我信了&#xff0c;当我等了一天&#xff0c;再次申请时候依然是同样的错误 不等了 当遇到这种情况该怎么办呢&#xff1f;这时候…

@RequestBody

目录 概述 深入细节 案例 RequestBody与前端传过来的json数据的匹配规则 指定模型中的属性对应什么key 用Valid校验RequestBody的参数 根据RequestBody的内容来区分使用哪个资源 概述 RequestBody主要用来接收前端传递给后端的json字符串中的数据(请求体中的数据)而最常…

【中级软件设计师】上午题02-程序设计语言

上午题02-程序设计语言 1 编译程序和解释程序2 程序设计语言基本成分3 传值调用与传引用调用4 编译器的工作阶段4.1 编译方式和解释方式4.2 符号表4.3 词法、语法、语义分析与目标代码生成4.4 程序异常和错误4.5 中间代码 5 正规式 1 编译程序和解释程序 解释器&#xff1a; 翻…