在处理文件时,常常需要对文件进行压缩和解压缩操作,以便节省存储空间或便于传输。Python 提供了多个模块来处理不同格式的压缩文件,其中最常用的是 zipfiletarfile 模块。

1 使用 zipfile 模块

zipfile 模块用于处理 .zip 压缩文件。它可以创建、读取、写入和解压 .zip 文件。让我们从基本的 .zip 文件压缩和解压操作开始。

1.1 创建 .zip 文件

可以使用 zipfile.ZipFile() 方法来创建 .zip 文件,并向其中添加文件。

import zipfile

# 创建一个 zip 文件,并向其中添加文件
with zipfile.ZipFile('example.zip', 'w') as zipf:
    zipf.write('file1.txt')
    zipf.write('file2.txt')

print("压缩完成")

解释:

  • zipfile.ZipFile():创建一个新的 .zip 文件对象。
  • 'w' 模式:表示以写入模式打开 .zip 文件。
  • write():将指定文件添加到 .zip 文件中。
  • 1.2 向现有 .zip 文件中追加文件

    如果想向已经存在的 .zip 文件中添加文件,可以使用 'a' 模式(追加模式):

    with zipfile.ZipFile('example.zip', 'a') as zipf:
        zipf.write('file3.txt')
    
    print("文件已追加到压缩包")
    
    1.3 解压 .zip 文件

    使用 extractall() 方法可以将 .zip 文件中的所有内容解压缩到指定目录。

    # 解压文件到指定目录
    with zipfile.ZipFile('example.zip', 'r') as zipf:
        zipf.extractall('extracted_files')
    
    print("文件已解压")
    

    解释:

  • 'r' 模式:表示以只读模式打开 .zip 文件。
  • extractall():将 .zip 文件中的所有文件解压缩到指定目录。
  • 1.4 列出 .zip 文件中的文件

    要查看 .zip 文件中包含的文件,可以使用 namelist() 方法。

    # 列出 zip 文件中的所有文件
    with zipfile.ZipFile('example.zip', 'r') as zipf:
        file_list = zipf.namelist()
        print("压缩包中的文件:", file_list)
    

    2 使用 tarfile 模块

    tarfile 模块用于处理 .tar.tar.gz 等格式的压缩文件。它的使用方式与 zipfile 类似,支持创建、读取和解压缩 tar 文件。

    2.1 创建 .tar 文件

    要创建 .tar 文件,并向其中添加文件,可以使用 tarfile.open() 方法。

    import tarfile
    
    # 创建 tar 文件并添加文件
    with tarfile.open('example.tar', 'w') as tarf:
        tarf.add('file1.txt')
        tarf.add('file2.txt')
    
    print("tar 文件创建完成")
    

    解释:

  • tarfile.open():用于创建或打开一个 tar 文件。
  • 'w' 模式:表示以写入模式创建 tar 文件。
  • add():将文件添加到 tar 文件中。
  • 2.2 创建 .tar.gz 文件

    如果想要创建一个 .tar.gz 文件,可以使用 'w:gz' 模式,这会对 .tar 文件进行 gzip 压缩。

    # 创建 tar.gz 文件
    with tarfile.open('example.tar.gz', 'w:gz') as tarf:
        tarf.add('file1.txt')
        tarf.add('file2.txt')
    
    print("tar.gz 文件创建完成")
    

    解释:

  • 'w:gz' 模式:表示创建一个 .tar 文件并使用 gzip 压缩。
  • 2.3 解压 .tar 文件

    .zip 文件类似,tarfile 模块也提供了解压文件的方法,可以使用 extractall() 来解压 .tar 文件。

    # 解压 tar 文件
    with tarfile.open('example.tar', 'r') as tarf:
        tarf.extractall('extracted_tar_files')
    
    print("tar 文件解压完成")
    
    2.4 解压 .tar.gz 文件

    解压 .tar.gz 文件与解压 .tar 文件类似,只需将打开模式设为 'r:gz'

    # 解压 tar.gz 文件
    with tarfile.open('example.tar.gz', 'r:gz') as tarf:
        tarf.extractall('extracted_tar_gz_files')
    
    print("tar.gz 文件解压完成")
    
    2.5 列出 .tar 文件中的内容

    使用 getnames() 方法可以列出 tar 文件中的所有文件。

    # 列出 tar 文件中的文件
    with tarfile.open('example.tar', 'r') as tarf:
        file_list = tarf.getnames()
        print("tar 文件中的文件:", file_list)
    

    3 使用 shutil 模块进行高层次文件压缩

    shutil 模块提供了 make_archive() 方法,能够快速创建 .zip.tar 格式的压缩文件。它封装了底层的压缩逻辑,使用起来非常方便。

    3.1 创建 .zip 压缩文件
    import shutil
    
    # 创建 zip 压缩文件
    shutil.make_archive('archive', 'zip', 'folder_to_compress')
    
    print("文件夹已压缩为 zip 文件")
    
    3.2 创建 .tar.gz 压缩文件
    # 创建 tar.gz 压缩文件
    shutil.make_archive('archive', 'gztar', 'folder_to_compress')
    
    print("文件夹已压缩为 tar.gz 文件")
    

    4 选择合适的压缩格式

    在选择压缩文件格式时,可以根据具体需求进行选择:

  • .zip 格式:广泛使用,特别适合需要在多平台间进行文件传输的场景。压缩速度较快,支持部分文件压缩,但压缩率相对较低。
  • .tar.gz 格式:压缩率较高,适合大文件的压缩和传输,常用于 Unix/Linux 系统。压缩速度较慢,但能更有效地减少文件大小。
  • 5 实际应用场景

    文件压缩与解压操作在数据备份、传输、存档等场景中非常常见。以下是一些常见的应用场景:

    1 备份文件和目录

    定期备份文件或目录是一项常见的自动化任务,尤其是对于重要数据,使用压缩可以节省存储空间。

    import shutil
    
    # 备份文件夹并压缩为 zip 文件
    shutil.make_archive('backup', 'zip', 'data_folder')
    
    print("数据已备份并压缩")
    
    2 文件解压并自动处理

    在某些场景中,自动化脚本会从网络上下载压缩包文件,解压后处理其中的数据。例如,处理定期更新的日志或报告文件。

    import zipfile
    
    # 解压 zip 文件并处理其中的文件
    with zipfile.ZipFile('data.zip', 'r') as zipf:
        zipf.extractall('extracted_data')
    
        # 处理解压后的文件
        for file in zipf.namelist():
            print(f"处理文件: {file}")
            # 在这里可以对文件进行进一步的操作,如分析数据
    

    作者:昱晏

    物联沃分享整理
    物联沃-IOTWORD物联网 » python压缩与解压文件

    发表回复