编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • ScriptHub 脚本工具箱
  • Python

  • Shell-Bash

  • 工具脚本

    • 工具脚本速查
    • 哈希校验
    • Base64编码
    • AES加解密
    • RSA签名验签
    • JWT令牌
    • JSON与YAML
    • XML与CSV
    • 编码转义
    • 图片转换
    • 文档转换
    • 批量重命名
    • 分割合并
    • 目录同步
    • 文件监控
    • 压缩归档
      • 归档与压缩的区别
      • 一、zipfile——ZIP 打包
      • 二、tarfile——tar 打包
      • 三、Shell 命令
      • 四、实战:内存流打包下载
    • 文件去重
    • cURL速查
    • HTTP调试
    • 端口DNS
    • 抓包代理
  • ScriptHub
  • 工具脚本
杨充
2022-02-03
目录

压缩归档

# 压缩归档

zipfile/tarfile 打包压缩、密码保护 zip、分卷压缩、Shell tar/zip、内存流打包下载。

# 归档与压缩的区别

这是两个独立的概念,常被混淆:

  • 归档(Archive):将多个文件合并为一个——tar 是典型归档格式,不压缩。
  • 压缩(Compression):用算法减少数据体积——gzip/bzip2/xz 是压缩算法。

tar.gz = 先用 tar 归档,再用 gzip 压缩——两步串行。为什么不是"边归档边压缩"? 因为压缩算法依赖上下文(前文的重复模式才能压缩后续数据),单文件归档为整体后再压缩,压缩率最高。

压缩算法对比:gzip(DEFLATE)速度快、压缩率一般——适合日常场景;bzip2(Burrows-Wheeler)速度中等、压缩率更好——适合归档;xz(LZMA2)速度慢、压缩率最高——适合长期存储。Python tarfile 支持 w:gz/w:bz2/w:xz 三种模式。

# 一、zipfile——ZIP 打包

ZIP 格式与 tar 的本质区别:ZIP 在文件内部维护索引表(Central Directory),允许随机访问单个文件——解压一个文件无需扫全包。tar 是流式格式,访问某文件必须从头扫描。

#!/usr/bin/env python3
import zipfile, os
from pathlib import Path

def create_zip(source_dir, output_path):
    """ZIP_DEFLATED = gzip 压缩算法"""
    with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zf:
        for f in Path(source_dir).rglob('*'):
            if f.is_file():
                zf.write(f, f.relative_to(source_dir))  # 相对路径避免绝对路径泄露

def extract_zip(zip_path, dest_dir='.'):
    with zipfile.ZipFile(zip_path, 'r') as zf:
        zf.extractall(dest_dir)

def create_encrypted_zip(source_dir, output_path, password):
    """⚠️ zipfile 的加密是传统 PKZIP(ZipCrypto)——AES-256 需第三方库"""
    with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zf:
        zf.setpassword(password.encode())
        for f in Path(source_dir).rglob('*'):
            if f.is_file(): zf.write(f, f.relative_to(source_dir))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 二、tarfile——tar 打包

tarfile 的 'r:*' 打开模式自动检测压缩格式——同一个接口解压 tar.gz/tar.bz2/tar.xz 无需区别对待。

#!/usr/bin/env python3
import tarfile, os

def create_tar(source_dir, output_path, mode='gz'):
    mode_map = {'gz': 'w:gz', 'bz2': 'w:bz2', 'xz': 'w:xz'}
    with tarfile.open(output_path, mode_map.get(mode, 'w:gz')) as tar:
        tar.add(source_dir, arcname=os.path.basename(source_dir))

def extract_tar(tar_path, dest_dir='.'):
    with tarfile.open(tar_path, 'r:*') as tar:
        tar.extractall(path=dest_dir)

def list_tar(tar_path):
    with tarfile.open(tar_path, 'r:*') as tar:
        for m in tar.getmembers():
            print(f"  {m.name} ({m.size} bytes)")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 三、Shell 命令

#!/bin/bash

tar -czf backup.tar.gz dir/          # -c 创建 -z gzip -f 文件
tar -cJf backup.tar.xz dir/          # -J xz 压缩
tar -xzf backup.tar.gz               # 解压
tar -tzf backup.tar.gz               # -t 查看
tar -czf - dir/ | ssh user@host "tar -xzf - -C /dst/"   # 管道直传

zip -r backup.zip dir/               # zip
unzip backup.zip
1
2
3
4
5
6
7
8
9
10

# 四、实战:内存流打包下载

io.BytesIO 流式打包的原理:tarfile 支持 fileobj 参数——可以将输出写入任何类文件对象(BytesIO/StringIO/socket),而非物理磁盘文件。对于 Web 多文件下载场景,这避免了两步操作(先写磁盘→再读取发送),直接流式输出到 HTTP Response。

#!/usr/bin/env python3
import tarfile, io, os

def tar_stream(paths):
    """打包到内存流——bytes 可直接用于 HTTP 响应"""
    buf = io.BytesIO()
    with tarfile.open(fileobj=buf, mode='w:gz') as tar:
        for p in paths:
            tar.add(p, arcname=os.path.basename(p))
    return buf.getvalue()
1
2
3
4
5
6
7
8
9
10
#工具#文件
上次更新: 2026/06/17, 12:47:39
文件监控
文件去重

← 文件监控 文件去重→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式