Python zipfile 与 tarfile
Python zipfile 与 tarfile 的完整教学讲解。
zipfile 读取
基本写法:打开 ZIP
zipfile.ZipFile(<文件>, <模式>)
# 打开 zip 文件
import zipfile
with zipfile.ZipFile("archive.zip", "r") as zf:
print(zf.namelist())
基本写法:列出文件
zf.namelist()
# 列出 zip 内所有文件
with zipfile.ZipFile("archive.zip") as zf:
for name in zf.namelist():
print(name)
基本写法:读取文件
zf.read(<文件名>)
# 读取 zip 内文件内容
with zipfile.ZipFile("archive.zip") as zf:
data = zf.read("data.txt")
print(data.decode())
基本写法:提取文件
zf.extract(<文件名>, <目录>)
# 提取单个文件
with zipfile.ZipFile("archive.zip") as zf:
zf.extract("data.txt", "output")
基本写法:提取全部
zf.extractall(<目录>)
# 提取全部文件
with zipfile.ZipFile("archive.zip") as zf:
zf.extractall("output")
zipfile 写入
基本写法:创建 ZIP
zipfile.ZipFile(<文件>, "w", <压缩>)
# 创建新 zip 文件
import zipfile
with zipfile.ZipFile("new.zip", "w", zipfile.ZIP_DEFLATED) as zf:
zf.write("data.txt")
zf.write("config.json")
基本写法:追加文件
zipfile.ZipFile(<文件>, "a")
# 追加文件到已有 zip
with zipfile.ZipFile("new.zip", "a") as zf:
zf.write("extra.txt")
基本写法:writestr 写入字符串
zf.writestr(<文件名>, <数据>)
# 直接写入字符串/字节
with zipfile.ZipFile("new.zip", "w") as zf:
zf.writestr("hello.txt", "Hello, World!")
zf.writestr("data.json", '{"a": 1}')
zipfile 信息
基本写法:获取文件信息
zf.getinfo(<文件名>)
# 获取 ZipInfo 对象
with zipfile.ZipFile("archive.zip") as zf:
info = zf.getinfo("data.txt")
print(info.file_size, info.compress_size, info.date_time)
基本写法:infolist 全部信息
zf.infolist()
# 获取所有文件信息
with zipfile.ZipFile("archive.zip") as zf:
for info in zf.infolist():
print(info.filename, info.file_size)
ZIP 加密
基本写法:密码解密
zf.setpassword(<密码>)
# 解密 zip
with zipfile.ZipFile("secret.zip") as zf:
zf.setpassword(b"password")
print(zf.read("data.txt"))
tarfile 读取
基本写法:打开 tar
tarfile.open(<文件>, <模式>)
# 打开 tar 文件
import tarfile
with tarfile.open("archive.tar.gz", "r:gz") as tf:
print(tf.getnames())
基本写法:列出成员
tf.getnames() | tf.getmembers()
# 列出 tar 内文件
with tarfile.open("archive.tar") as tf:
for m in tf.getmembers():
print(m.name, m.size, m.isfile())
基本写法:提取文件
tf.extract(<成员>, <目录>)
# 提取单个文件
with tarfile.open("archive.tar") as tf:
tf.extract("data.txt", "output")
基本写法:提取全部
tf.extractall(<目录>)
# 提取全部
with tarfile.open("archive.tar") as tf:
tf.extractall("output")
基本写法:安全提取(3.12+)
tf.extractall(<目录>, filter="data")
# 3.12+ 推荐使用 filter 防止路径穿越
with tarfile.open("archive.tar") as tf:
tf.extractall("output", filter="data")
tarfile 写入
基本写法:创建 tar
tarfile.open(<文件>, "w:<压缩>")
# 创建 tar.gz
with tarfile.open("new.tar.gz", "w:gz") as tf:
tf.add("data.txt")
tf.add("config.json")
基本写法:添加文件
tf.add(<文件>, arcname=<归档名>)
# 指定归档内文件名
with tarfile.open("new.tar", "w") as tf:
tf.add("data.txt", arcname="dir/data.txt")
基本写法:addfile 写入
tf.addfile(<TarInfo>, <文件对象>)
# 手动构造 TarInfo 写入
import io
info = tarfile.TarInfo(name="hello.txt")
data = b"Hello, World!"
info.size = len(data)
with tarfile.open("new.tar", "w") as tf:
tf.addfile(info, io.BytesIO(data))
tarfile 模式
基本写法:压缩模式
"w:gz" | "w:bz2" | "w:xz"
# 不同压缩格式
tarfile.open("a.tar.gz", "w:gz")
tarfile.open("a.tar.bz2", "w:bz2")
tarfile.open("a.tar.xz", "w:xz")
基本写法:流式读取
"r|gz"
# 流式读取大文件
with tarfile.open("big.tar.gz", "r|gz") as tf:
for member in tf:
f = tf.extractfile(member)
if f:
print(f.read()[:50])
TarInfo 对象
基本写法:创建 TarInfo
tarfile.TarInfo(<名称>)
# 创建文件信息
info = tarfile.TarInfo("data.txt")
info.size = 100
info.mode = 0o644
基本写法:从文件创建
tf.gettarinfo(<文件对象>)
# 从现有文件创建 TarInfo
with open("data.txt", "rb") as f:
info = tf.gettarinfo(fileobj=f)