Python脚本如何操作ZIP压缩包

wen 实用脚本 1

本文目录导读:

Python脚本如何操作ZIP压缩包

  1. 使用 zipfile 模块
  2. 使用 shutil 模块(简化操作)
  3. 实用示例
  4. 压缩模式说明
  5. 压缩算法

我来详细介绍Python操作ZIP压缩包的几种主要方法。

使用 zipfile 模块

zipfile 是Python内置的模块,无需额外安装。

创建ZIP压缩包

import zipfile
import os
# 创建ZIP文件并添加文件
with zipfile.ZipFile('archive.zip', 'w', zipfile.ZIP_DEFLATED) as zf:
    # 添加单个文件
    zf.write('file1.txt')
    # 添加文件并指定在压缩包中的路径
    zf.write('file2.txt', 'documents/file2.txt')
    # 添加整个目录
    for root, dirs, files in os.walk('my_folder'):
        for file in files:
            file_path = os.path.join(root, file)
            # 保留目录结构
            arcname = os.path.relpath(file_path, os.path.dirname('my_folder'))
            zf.write(file_path, arcname)

读取ZIP压缩包

# 查看ZIP文件内容
with zipfile.ZipFile('archive.zip', 'r') as zf:
    # 列出所有文件
    print(zf.namelist())
    # 获取文件信息
    for info in zf.infolist():
        print(f"文件名: {info.filename}")
        print(f"原始大小: {info.file_size}")
        print(f"压缩后大小: {info.compress_size}")
        print("-" * 30)

解压ZIP压缩包

# 解压所有文件到指定目录
with zipfile.ZipFile('archive.zip', 'r') as zf:
    zf.extractall('output_folder')
# 解压单个文件
with zipfile.ZipFile('archive.zip', 'r') as zf:
    zf.extract('file1.txt', 'output_folder')
# 解压到当前目录
with zipfile.ZipFile('archive.zip', 'r') as zf:
    zf.extractall()

读取压缩包内的文件内容

with zipfile.ZipFile('archive.zip', 'r') as zf:
    # 读取特定文件内容
    with zf.open('file1.txt') as f:
        content = f.read().decode('utf-8')
        print(content)
    # 或使用read()方法
    content = zf.read('file1.txt').decode('utf-8')

使用 shutil 模块(简化操作)

import shutil
# 压缩整个目录
shutil.make_archive('output', 'zip', 'source_folder')
# 解压ZIP文件
shutil.unpack_archive('archive.zip', 'extract_folder', 'zip')

实用示例

带密码的ZIP文件

import zipfile
# 创建加密ZIP文件
with zipfile.ZipFile('protected.zip', 'w', zipfile.ZIP_DEFLATED) as zf:
    zf.setpassword(b'my_password')
    zf.write('secret.txt')
# 读取加密ZIP文件
with zipfile.ZipFile('protected.zip', 'r') as zf:
    zf.setpassword(b'my_password')
    zf.extractall('output')

内存中的ZIP操作

import zipfile
import io
# 在内存中创建ZIP
buffer = io.BytesIO()
with zipfile.ZipFile(buffer, 'w', zipfile.ZIP_DEFLATED) as zf:
    zf.writestr('hello.txt', 'Hello, World!')
    zf.writestr('data.csv', 'name,age\nAlice,30\nBob,25')
# 读取内存中的ZIP
buffer.seek(0)
with zipfile.ZipFile(buffer, 'r') as zf:
    print(zf.read('hello.txt').decode('utf-8'))

过滤文件进行压缩

def zip_filtered_files(filename, files_to_zip, extensions=['.txt', '.csv']):
    """只压缩指定扩展名的文件"""
    with zipfile.ZipFile(filename, 'w', zipfile.ZIP_DEFLATED) as zf:
        for file_path in files_to_zip:
            if any(file_path.endswith(ext) for ext in extensions):
                zf.write(file_path)
# 使用示例
import glob
all_files = glob.glob('*')
zip_filtered_files('filtered.zip', all_files, ['.txt', '.md'])

处理大文件(分块读取)

import zipfile
def extract_large_file(zip_path, file_name, output_path):
    """分块解压大文件"""
    with zipfile.ZipFile(zip_path, 'r') as zf:
        with zf.open(file_name) as source:
            with open(output_path, 'wb') as target:
                while True:
                    chunk = source.read(1024 * 1024)  # 1MB chunks
                    if not chunk:
                        break
                    target.write(chunk)
# 使用示例
extract_large_file('large_archive.zip', 'big_file.dat', 'output.dat')

压缩模式说明

  • 'r': 读取已存在的ZIP文件
  • 'w': 创建新ZIP文件或覆盖已存在的文件
  • 'a': 追加到已存在的ZIP文件
  • 'x': 创建新ZIP文件,如果文件已存在则报错

压缩算法

# ZIP_STORED: 不压缩,仅存储(默认)
# ZIP_DEFLATED: 使用DEFLATE算法压缩
# ZIP_BZIP2: 使用BZIP2算法压缩
# ZIP_LZMA: 使用LZMA算法压缩
with zipfile.ZipFile('compressed.zip', 'w', zipfile.ZIP_BZIP2) as zf:
    zf.write('large_file.txt')

这些方法覆盖了Python操作ZIP文件的大部分场景,可以根据具体需求选择合适的方法。

抱歉,评论功能暂时关闭!