Python Zstd压缩解压

python 复制代码
import tarfile
from pathlib import Path
from compression.zstd import ZstdFile, CompressionParameter


def compress_folder(src_folder: str, output_file: str, level: int = 9):
    """
    将 src_folder 文件夹压缩为一个 .tar.zst 文件
    :param src_folder: 待压缩的文件夹路径
    :param output_file: 输出的压缩文件路径,例如 'archive.tar.zst'
    :param level: 压缩级别 (1-22,默认22为最高,速度越慢)
    """
    src_path = Path(src_folder)
    if not src_path.is_dir():
        raise NotADirectoryError(f"{src_folder} 不是一个有效的文件夹")

    # 打开 zstd 压缩文件(以二进制写模式),并指定压缩级别
    with ZstdFile(output_file, mode="wb",
                  options={CompressionParameter.compression_level: level}) as zf:
        # 在 zstd 压缩流之上再包一层 tar 归档,实现"打包+压缩"
        with tarfile.open(fileobj=zf, mode="w|") as tar:
            tar.add(src_path, arcname=src_path.name)

    print(f"压缩完成: {output_file}")


def decompress_folder(archive_file: str, dest_folder: str = "."):
    """
    解压 .tar.zst 文件到指定目录
    :param archive_file: 压缩文件路径,例如 'archive.tar.zst'
    :param dest_folder: 解压目标目录,默认当前目录
    """
    Path(dest_folder).mkdir(parents=True, exist_ok=True)

    with ZstdFile(archive_file, mode="rb") as zf:
        with tarfile.open(fileobj=zf, mode="r|") as tar:
            tar.extractall(path=dest_folder)  # Python 3.14 默认使用安全过滤器 filter="data"

    print(f"解压完成,文件已还原到: {dest_folder}")


if __name__ == "__main__":
    # compress_folder("C:/Users/zhoull/Downloads/ebook", "C:/Users/zhoull/Downloads/ebook.tar.zst", level=9)
    decompress_folder("C:/Users/zhoull/Downloads/ebook.tar.zst", "D:/output_folder")
相关推荐
爱上纯净的蓝天39 分钟前
不用云做 RAG:一个本地笔记问答工具的取舍与坑
python·开源·大模型·rag·本地部署
cspttty1 小时前
2027风险管理岗准备路线:数学与应用数学如何补齐金融、SQL与Python
开发语言·python·金融
用户8356290780511 小时前
如何使用 Python 格式化 Excel 单元格中的长文本
后端·python
我命由我123451 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
严谨的麻辣烫2 小时前
Python HTTP 连接池怎么用?从连接复用到请求异常排查
开发语言·python·http·requests·网络排查
摇滚侠2 小时前
《Java并发编程之美》第 4 章 Java 并发包中原子操作类原理剖析 阅读笔记 7
java·笔记·python
用户8356290780512 小时前
如何使用 Python 在 Word 文档中创建和格式化列表
后端·python
GIoT80102 小时前
网络出口如何选择?固定 IP 与 IP 轮换的原理及实践
python
羡林i2 小时前
ProcessPoolExecutor 传参踩坑实测:pickle 失败的四种写法
python
Dmz丶3 小时前
前端转 AI 100 天 Day 30:正式上线——从零部署一个完整服务(含 30 天复盘)
python