python使用DEFLATE 算法decode(‘ascii‘)编码打包的自定义格式的压缩包并未生成

发布于:2024-03-11 ⋅ 阅读:(65) ⋅ 点赞:(0)

问题描述:打包都为报错且打包的文件大小为0

打包程序:

import os
import zlib

def compress_folder_to_custom_format(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:
                data = f.read()
                # 使用 DEFLATE 算法压缩文件内容
                compressed_data += zlib.compress(data)
                # 添加文件名作为元数据
                compressed_data += file.encode('ascii') + b'\n'  # 文件名

    # 将所有文件的压缩数据和元数据写入到输出文件中
    with open(output_filename, 'wb') as f_out:
        f_out.write(compressed_data)

# 指定要压缩的文件夹路径和输出文件名
input_folder = 'example_folder'
output_filename = 'package.pg'

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

解压程序:

import zlib
import os

def decompress_custom_format(input_filename, output_folder):
    """
    解压使用 DEFLATE 算法使用 decode('ascii') 编码的自定义格式的压缩包。

    Parameters:
        input_filename: str
            压缩包文件名。
        output_folder: str
            解压后的输出文件夹路径。
    """
    # 读取压缩包文件内容
    with open("./" + input_filename, 'rb') as f:
        # 读取压缩包的数据
        compressed_data = f.read()

    # 解析压缩包数据和元数据
    file_index = 0
    while file_index < len(compressed_data):
        # 找到下一个文件的文件名
        next_file_name_end = compressed_data.find(b'\n', file_index)
        if next_file_name_end == -1:
            break
        file_name = compressed_data[file_index:next_file_name_end].decode('ascii')
        file_index = next_file_name_end + 1

        # 提取压缩数据
        next_file_data_end = compressed_data.find(b'\n', file_index)
        if next_file_data_end == -1:
            break
        file_data = compressed_data[file_index:next_file_data_end]
        file_index = next_file_data_end + 1

        # 使用 zlib 解压缩数据
        decompressed_data = zlib.decompress(file_data)

        # 将解压后的数据写入到输出文件夹中
        output_filepath = os.path.join(output_folder, file_name)
        with open(output_filepath, 'wb') as f_out:
            f_out.write(decompressed_data)

# 压缩包文件名
input_filename = 'package.pg'
# 解压后的输出文件夹路径
output_folder = './packageun'

# 解压压缩包
decompress_custom_format(input_filename, output_folder)