当前位置: 技术文章>> 如何用 Python 实现文件压缩和解压缩?

文章标题:如何用 Python 实现文件压缩和解压缩?
  • 文章分类: 后端
  • 6180 阅读

在Python中实现文件压缩与解压缩,是处理大数据和优化存储空间的常用手段。Python提供了多种库来支持这一功能,其中最为常用的是zlibgzipbz2zipfile以及第三方库如rarfile(针对RAR格式,尽管不是Python标准库)和pyzipper(支持AES加密的zip文件)。这里,我们将重点介绍gzipzipfile两个库的使用,因为它们在处理常见压缩文件时非常高效且易于使用。

使用gzip进行文件压缩与解压缩

gzip是Python标准库之一,主要用于单个文件的压缩和解压缩,生成的压缩文件以.gz为后缀。它基于DEFLATE算法,适用于文本文件和二进制文件的压缩。

压缩文件

要使用gzip压缩文件,可以打开源文件,然后使用gzip.open以写入模式('wb')打开一个新的压缩文件,并将源文件的内容写入到压缩文件中。

import gzip

def gzip_compress(input_filepath, output_filepath):
    """
    使用gzip压缩文件
    :param input_filepath: 源文件路径
    :param output_filepath: 压缩后文件路径
    """
    with open(input_filepath, 'rb') as f_in:
        with gzip.open(output_filepath, 'wb') as f_out:
            f_out.writelines(f_in)

# 示例用法
gzip_compress('example.txt', 'example.txt.gz')

解压缩文件

解压缩过程与压缩类似,但方向相反。使用gzip.open以读取模式('rb')打开压缩文件,并读取其内容,然后可以将这些内容写入到一个新的未压缩文件中。

def gzip_decompress(input_filepath, output_filepath):
    """
    使用gzip解压缩文件
    :param input_filepath: 压缩文件路径
    :param output_filepath: 解压缩后文件路径
    """
    with gzip.open(input_filepath, 'rb') as f_in:
        with open(output_filepath, 'wb') as f_out:
            f_out.writelines(f_in)

# 示例用法
gzip_decompress('example.txt.gz', 'example_decompressed.txt')

使用zipfile进行文件压缩与文件夹压缩

zipfile库提供了对ZIP归档文件的读写支持,它既可以用来压缩单个文件,也可以用来将整个文件夹及其内容压缩成一个ZIP文件。

压缩文件或文件夹

要压缩文件或文件夹,首先需要将想要压缩的项(文件或文件夹路径)列出来,然后使用zipfile.ZipFile以写入模式('w')打开一个新的ZIP文件,并将这些项添加到ZIP归档中。

import zipfile
import os

def zip_files(file_or_folder_paths, zip_output_path):
    """
    将文件或文件夹压缩为ZIP文件
    :param file_or_folder_paths: 要压缩的文件或文件夹路径列表
    :param zip_output_path: 输出的ZIP文件路径
    """
    with zipfile.ZipFile(zip_output_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
        for path in file_or_folder_paths:
            if os.path.isdir(path):
                for root, dirs, files in os.walk(path):
                    for file in files:
                        zipf.write(os.path.join(root, file),
                                   arcname=os.path.relpath(os.path.join(root, file),
                                                          os.path.commonprefix((root, path))))
            else:
                zipf.write(path, arcname=os.path.basename(path))

# 示例用法
zip_files(['folder_to_compress', 'example.txt'], 'output.zip')

注意:在压缩文件夹时,os.walk用于遍历文件夹中的所有文件和子文件夹,zipf.write的第二个参数arcname用于指定压缩包中的文件名,确保文件在ZIP归档中保持正确的结构。

解压ZIP文件

解压ZIP文件相对简单,只需使用zipfile.ZipFile以读取模式('r')打开ZIP文件,然后使用extractallextract方法解压。

def unzip_file(zip_filepath, extract_to_path):
    """
    解压ZIP文件到指定目录
    :param zip_filepath: ZIP文件路径
    :param extract_to_path: 解压到的目标目录
    """
    with zipfile.ZipFile(zip_filepath, 'r') as zip_ref:
        zip_ref.extractall(extract_to_path)

# 示例用法
unzip_file('output.zip', 'extracted_files')

注意事项

  • 在处理大文件或大量文件时,注意内存和磁盘空间的使用情况。
  • 压缩和解压缩过程中可能会遇到文件权限问题,确保程序有足够的权限访问和操作这些文件。
  • 对于涉及敏感信息的文件,考虑使用加密压缩方式(如pyzipper支持的AES加密ZIP文件)。

码小课网站相关

码小课网站上,我们提供了丰富的Python编程教程,包括但不限于文件处理、数据压缩与解压缩等主题。我们致力于通过深入浅出的讲解和丰富的实例代码,帮助编程爱好者及专业人士快速掌握Python编程技能。无论你是初学者还是有一定基础的进阶者,都能在码小课找到适合自己的学习资源。欢迎访问我们的网站,开启你的Python编程之旅!