压缩与归档:完整实践与解答
需能区分源目录、目标文件和归档成员。固定文件 ZIP 示例依赖 Python 3.11+ 标准库与 zlib,只打包 first.txt、second.txt,拒绝已有输出和符号链接;它不解压外部包。本文另说明恢复前应检查的路径、完整性和资源预算。 示例未在本轮执行;本页完整源码与README列出输入、阅读顺序和预期。
归档 完整创建器
归档完整创建器只把固定输入目录中两个明确文件打入ZIP,拒绝符号链接和已有输出。示例未执行;它不是任意归档解压器,不调用系统压缩命令,README列出成员和恢复边界。
归档 路径穿越练习
题目:成员名../outside.txt应如何处理?
参考答案
拒绝该成员并停止解压计划,不能仅去掉前导../后继续,因为这会改名并可能覆盖其他文件。检查归档前不要向目标写任何数据。
归档 恢复演练
归档恢复演练应在独立空目录核对成员数、摘要和必要元数据。只创建压缩包不等于备份成功,必须保留原件;本例未解压未运行,删除输出ZIP不会触及输入文件。
完整源码、配置与输入
下列文件与仓库同源,包含完整实现和输入;不是运行证明。部分练习只需人工阅读配置,不强制构造模拟器。
input/first.txt
text
First fictional archive member.input/second.txt
text
Second fictional archive member.archive.py
python
import sys
import zipfile
from pathlib import Path
def create(source, target):
names = ("first.txt", "second.txt")
contents = []
for name in names:
path = source / name
if path.is_symlink() or not path.is_file():
raise ValueError(f"not a regular input: {name}")
if path.stat().st_size > 1048576:
raise ValueError(f"input too large: {name}")
contents.append((name, path.read_bytes()))
if target.resolve() in [(source / n).resolve() for n in names]:
raise ValueError("output cannot replace input")
with zipfile.ZipFile(target, "x", compression=zipfile.ZIP_DEFLATED) as archive:
for name, data in contents:
archive.writestr(name, data)
print("created ZIP members=2; no extraction performed")
if __name__ == "__main__":
try:
if len(sys.argv) != 3:
raise ValueError("usage: python archive.py INPUT_DIRECTORY NEW_OUTPUT.zip")
create(Path(sys.argv[1]), Path(sys.argv[2]))
except (ValueError, OSError, zipfile.BadZipFile) as exc:
print(str(exc), file=sys.stderr)
sys.exit(2)requirements.txt
text
# Python 3.11+ standard library with zlib support for ZIP_DEFLATED.
# No external archive tool; no untrusted archive is extracted.项目README与完整依赖
README提供前置、完整自跑或阅读方式、预期、失败案例与恢复清理。本轮没有执行任何示例、产品CLI、模型或外部API。
markdown
# 压缩与归档:完整教学包
示例未执行。全部输入为教学虚构资料,不能用于真实账号、生产数据或外部系统。
## 前置与依赖
Python3.11以上标准库及zlib,Linux将python改python3;input应为可信独立目录。
## 文件与输入
- `input/first.txt`:本包完整文件。
- `input/second.txt`:本包完整文件。
- `archive.py`:本包完整文件。
- `requirements.txt`:本包完整文件。
## 读者将来自跑或阅读
复制本包所有文件到独立目录,在该目录作为当前工作目录。以下是读者自用资料,本轮禁止执行。
```text
python archive.py input result-new.zip
```
## 正常预期
创建包含first.txt与second.txt的ZIP,输出created ZIP members=2;不解压、不恢复权限。
## 失败案例与恢复
输出已存在则拒绝;输入任一为符号链接或大小超过1MiB则在创建ZIP前拒绝。
## 清理及能力边界
不是不可信ZIP扫描器,不接受外部包;IO失败可留下部分ZIP,人工核对后只删result-new.zip,不动input。
## 来源
- [官方依据](https://docs.python.org/3/library/zipfile.html)(2026-10-17资料核对;不是运行证明)依据与适用范围
- 本课官方依据,资料核对日2026-10-17。
本课完成的是列明任务的理论与静态资料,不代表产品全部能力或三平台运行通过。历史文档保留旧URL;涉及账号、版本、价格与界面位置时,以对应官方资料及实际授权环境为准。
继续阅读
- 压缩与归档上手与对象