器→工具, 工具软件, 术→技巧, 研发, 编程语言

使用Python进行压缩与解压缩

钱魏Way · · 990 次浏览

在日常工作中,除了会涉及到使用Python处理文本文件,有时候还会涉及对压缩文件的处理。

通常会涉及到的压缩文件格式有:

  • rar:Windows 环境下用的比较多的压缩,比较著名的GUI工具是winrar
  • tar: Linux系统下的打包工具,只打包,不压缩
  • gz:即gzip,通常只能压缩一个文件。与tar结合起来就可以实现先打包,再压缩。
  • tgz:即gz。先用tar打包,然后再用gz压缩得到的文件
  • zip:不同于gzip,虽然使用相似的算法,可以打包压缩多个文件,不过分别压缩文件,压缩率低于tar
  • 7z:7zip压缩软件支持的格式,压缩效率较高。

当然除了使用Python外,你还可以选择使用压缩解压缩软件或命令手动进行处理。

zlib:兼容 gzip 的压缩

zlib 是 Python 标准库中的一个模块,提供了对数据压缩和解压缩的支持。它基于 zlib 库,这是一个广泛使用的压缩库,通常用于在数据传输和存储时减小数据的大小。

主要功能

  • 数据压缩:将数据压缩为更小的格式以节省存储空间和传输带宽。
  • 数据解压缩:将压缩的数据还原为原始格式。
  • 流式压缩和解压缩:支持处理数据流而不是一次性处理整个数据。

工作机制

  • 数据压缩:使用 DEFLATE 算法对数据进行压缩。DEFLATE 是一种结合了 LZ77 算法和霍夫曼编码的压缩算法。
  • 数据解压缩:通过 DEFLATE 解压缩算法将数据还原为原始格式。
  • 流式压缩和解压缩:compressobj 和 decompressobj 允许逐步处理数据流,而不是一次性处理整个数据。

使用场景

  • 数据压缩:在需要减小数据大小的应用中,如文件存储、网络传输等。
  • 数据解压缩:从压缩格式中恢复原始数据。
  • 数据完整性验证:使用 CRC-32 校验和验证数据的完整性。

压缩和解压缩数据

import zlib

# 原始数据
data = b"this is the data to be compressed"

# 压缩数据
compressed_data = zlib.compress(data)
print("Compressed:", compressed_data)

# 解压缩数据
decompressed_data = zlib.decompress(compressed_data)
print("Decompressed:", decompressed_data)

流式压缩

import zlib

compressor = zlib.compressobj()
compressed_data = compressor.compress(b"data part 1")
compressed_data += compressor.compress(b"data part 2")
compressed_data += compressor.flush()

print("Compressed data:", compressed_data)

流式解压缩

import zlib

decompressor = zlib.decompressobj()
decompressed_data = decompressor.decompress(b"x\x9cK\xce\xc9\xc9W(\xcf/\xcaIQ\x04\x00\x1f\x8c\x03\x99")
decompressed_data += decompressor.flush()

print("Decompressed data:", decompressed_data)

计算 CRC-32 校验和

import zlib

data = b"data to check"
crc_value = zlib.crc32(data)
print("CRC-32:", crc_value)

zlib 模块提供了对数据压缩和解压缩的强大支持,适用于需要减小数据大小的场景。它使用了高效的 DEFLATE 算法,并且支持流式压缩和解压缩。zlib 是处理数据存储和传输时压缩需求的一个非常实用的工具。

zlib.compress() 函数

zlib.compress() 函数用于压缩数据。

参数:

  • data:要压缩的数据,应该是 bytes 类型。
  • level:压缩级别,取值范围从 0 到 9,默认为 -1,表示使用默认压缩级别。

返回值:

  • 返回压缩后的数据,类型为 bytes。

示例:

import zlib

data = b"this is the data to be compressed"
compressed_data = zlib.compress(data)
print(compressed_data)

zlib.decompress() 函数

zlib.decompress() 函数用于解压缩数据。

参数:

  • data:要解压缩的数据,应该是 bytes 类型。

返回值:

  • 返回解压缩后的数据,类型为 bytes。

示例:

import zlib

compressed_data = b"x\x9cK\xce\xc9\xc9W(\xcf/\xcaIQ\x04\x00\x1f\x8c\x03\x99"
decompressed_data = zlib.decompress(compressed_data)
print(decompressed_data)  # 输出:b'this is the data to be compressed'

zlib.compressobj() 函数

zlib.compressobj() 函数用于创建一个压缩对象,允许更细粒度的控制压缩过程。

参数:

  • level:压缩级别,取值范围从 0 到 9,默认为 -1。
  • method:压缩方法,默认为DEFLATED。
  • wbits:窗口大小,默认为 15。
  • memLevel:内存级别,默认为 8。
  • strategy:压缩策略,默认为 Z_DEFAULT_STRATEGY。

返回值:

  • 返回一个compressobj 对象。

示例:

import zlib

compressor = zlib.compressobj()
compressed_data = compressor.compress(b"data to compress")
compressed_data += compressor.flush()
print(compressed_data)

zlib.decompressobj() 函数

zlib.decompressobj() 函数用于创建一个解压缩对象,允许更细粒度的控制解压缩过程。

参数:

  • wbits:窗口大小,默认为 15。
  • bufsize:缓冲区大小,默认为 8192。

返回值:

  • 返回一个decompressobj 对象。

示例:

import zlib

decompressor = zlib.decompressobj()
decompressed_data = decompressor.decompress(b"x\x9cK\xce\xc9\xc9W(\xcf/\xcaIQ\x04\x00\x1f\x8c\x03\x99")
decompressed_data += decompressor.flush()
print(decompressed_data)  # 输出:b'this is the data to be compressed'

zlib.crc32() 函数

zlib.crc32() 函数计算 CRC-32 校验和,用于验证数据完整性。

参数:

  • data:要计算校验和的数据,应该是 bytes 类型。
  • crc:可选参数,表示初始 CRC 值。

返回值:

  • 返回 CRC-32 校验和的整数值。

示例:

import zlib

data = b"data to check"
crc_value = zlib.crc32(data)
print(crc_value)

gzip:读写 GNU zip 文件

gzip 是 Python 标准库中的一个模块,提供了对 GNU gzip 格式的压缩和解压缩支持。GNU gzip 是一种广泛使用的文件压缩工具,它使用 DEFLATE 算法进行数据压缩。gzip 模块允许在 Python 程序中读取和写入 .gz 格式的压缩文件。

主要功能

  • 文件压缩:将文件压缩为 .gz 格式。
  • 文件解压缩:从 .gz 格式的文件中解压缩数据。
  • 流式压缩和解压缩:支持逐步处理数据流而不是一次性处理整个文件。

工作机制

  • 数据压缩:使用 DEFLATE 算法将数据压缩为 .gz 格式。gzip 格式包括一个头部和一个尾部,头部包含文件的元数据,尾部包含数据的 CRC 校验和。
  • 数据解压缩:通过 .gz 文件的头部和尾部将数据还原为原始格式。

使用场景

  • 文件压缩:将文件压缩为 .gz 格式,以节省存储空间和传输带宽。
  • 文件解压缩:从 .gz 格式的文件中恢复原始数据。
  • 流式处理:处理大型文件或数据流时逐步进行压缩和解压缩。

压缩和解压缩文件

import gzip

# 压缩文件
with gzip.open('example_file.gz', 'wt') as f:
    f.write('This is some example text that will be compressed.')

# 解压缩文件
with gzip.open('example_file.gz', 'rt') as f:
    content = f.read()
    print(content)  # 输出:This is some example text that will be compressed.

压缩和解压缩数据

import gzip

# 压缩数据
data = b'Some data to be compressed'
compressed_data = gzip.compress(data)
print("Compressed data:", compressed_data)

# 解压缩数据
decompressed_data = gzip.decompress(compressed_data)
print("Decompressed data:", decompressed_data.decode())

gzip 模块为 Python 提供了对 GNU gzip 格式的文件压缩和解压缩支持。它允许在程序中处理 .gz 格式的文件和数据流,支持文件压缩、数据压缩和解压缩。gzip 是处理文件存储和传输时压缩需求的一个有效工具。

gzip.open() 函数

gzip.open() 函数用于打开一个 .gz 文件,支持读取和写入操作。

参数:

  • filename:文件名或路径。
  • mode:文件模式,指定打开方式。常见的值包括 ‘r’(读取),’w’(写入),’ab’(追加)。
  • compresslevel:可选参数,指定压缩级别,从 0 到 9,默认为 9(最高压缩级别)。

返回值:

  • 返回一个类文件对象,支持文件的读取和写入操作。

示例:

import gzip

# 写入压缩文件
with gzip.open('example.gz', 'wt') as f:
    f.write('This is an example of gzip compression.')

# 读取压缩文件
with gzip.open('example.gz', 'rt') as f:
    content = f.read()
    print(content)  # 输出:This is an example of gzip compression.

gzip.GzipFile 类

gzip.GzipFile 类提供了对 .gz 文件的读取和写入操作,允许更细粒度的控制。

参数:

  • filename:文件名或路径。
  • mode:文件模式,指定打开方式(同open())。
  • compresslevel:可选参数,指定压缩级别。
  • fileobj:可选参数,指定一个文件对象。

示例:

import gzip

# 使用 GzipFile 类写入压缩文件
with gzip.GzipFile('example2.gz', 'wb', compresslevel=5) as f:
    f.write(b'This is another example of gzip compression.')

# 使用 GzipFile 类读取压缩文件
with gzip.GzipFile('example2.gz', 'rb') as f:
    content = f.read()
    print(content.decode())  # 输出:This is another example of gzip compression.

gzip.compress() 函数

gzip.compress() 函数用于将数据压缩为 .gz 格式的字节串。

参数:

  • data:要压缩的数据,应该是 bytes 类型。
  • compresslevel:可选参数,指定压缩级别。

返回值:

  • 返回压缩后的数据,类型为 bytes。

示例:

import gzip

data = b'This is data to be compressed'
compressed_data = gzip.compress(data)
print(compressed_data)

gzip.decompress() 函数

gzip.decompress() 函数用于将 .gz 格式的压缩数据解压缩为原始数据。

参数:

  • data:要解压缩的数据,应该是 bytes 类型。

返回值:

  • 返回解压缩后的数据,类型为 bytes。

示例:

import gzip

compressed_data = b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x0b\xc9\xc8\xcf\x07\x00\x12\x16\x04\x1d\x00\x00\x00'
decompressed_data = gzip.decompress(compressed_data)
print(decompressed_data)  # 输出:b'This is data to be compressed'

bz2:bzip2 压缩

bz2 是 Python 标准库中的一个模块,提供了对 bzip2 格式的压缩和解压缩支持。bzip2 是一种高效的压缩算法,通常用于压缩文本文件。bz2 模块允许在 Python 程序中读取和写入 .bz2 格式的压缩文件。

主要功能

  • 文件压缩:将文件压缩为 .bz2 格式。
  • 文件解压缩:从 .bz2 格式的文件中解压缩数据。
  • 流式压缩和解压缩:支持逐步处理数据流而不是一次性处理整个文件。

bz2.open() 函数

bz2.open() 函数用于打开一个 .bz2 文件,支持读取和写入操作。

参数:

  • filename:文件名或路径。
  • mode:文件模式,指定打开方式。常见的值包括 ‘r’(读取),’w’(写入),’ab’(追加)。还可以使用 ‘rt’ 和 ‘wt’ 模式,分别用于读取和写入文本。
  • compresslevel:可选参数,指定压缩级别,从 1 到 9,默认为 9(最高压缩级别)。

返回值:

  • 返回一个类文件对象,支持文件的读取和写入操作。

示例:

import bz2

# 写入压缩文件
with bz2.open('example.bz2', 'wt') as f:
    f.write('This is an example of bzip2 compression.')

# 读取压缩文件
with bz2.open('example.bz2', 'rt') as f:
    content = f.read()
    print(content)  # 输出:This is an example of bzip2 compression.

bz2.BZ2File 类

bz2.BZ2File 类提供了对 .bz2 文件的读取和写入操作,允许更细粒度的控制。

参数:

  • filename:文件名或路径。
  • mode:文件模式,指定打开方式(同open())。
  • compresslevel:可选参数,指定压缩级别。

示例:

import bz2

# 使用 BZ2File 类写入压缩文件
with bz2.BZ2File('example2.bz2', 'wb', compresslevel=5) as f:
    f.write(b'This is another example of bzip2 compression.')

# 使用 BZ2File 类读取压缩文件
with bz2.BZ2File('example2.bz2', 'rb') as f:
    content = f.read()
    print(content.decode())  # 输出:This is another example of bzip2 compression.

bz2.compress() 函数

bz2.compress() 函数用于将数据压缩为 .bz2 格式的字节串。

参数:

  • data:要压缩的数据,应该是 bytes 类型。
  • compresslevel:可选参数,指定压缩级别。

返回值:

  • 返回压缩后的数据,类型为 bytes。

示例:

import bz2

data = b'This is data to be compressed'
compressed_data = bz2.compress(data)
print(compressed_data)

bz2.decompress() 函数

bz2.decompress() 函数用于将 .bz2 格式的压缩数据解压缩为原始数据。

参数:

  • data:要解压缩的数据,应该是 bytes 类型。

返回值:

  • 返回解压缩后的数据,类型为 bytes。

lzma:xz 压缩

lzma 是 Python 标准库中的一个模块,提供了对 LZMA(Lempel-Ziv-Markov chain algorithm)格式的压缩和解压缩支持。LZMA 是一种高效的压缩算法,通常用于压缩数据文件。lzma 模块允许在 Python 程序中读取和写入 .xz 和 .lzma 格式的压缩文件。

主要功能

  • 文件压缩:将文件压缩为 .xz 或 .lzma 格式。
  • 文件解压缩:从 .xz 或 .lzma 格式的文件中解压缩数据。
  • 流式压缩和解压缩:支持逐步处理数据流而不是一次性处理整个文件。

lzma.open() 函数

lzma.open() 函数用于打开一个 .xz 或 .lzma 文件,支持读取和写入操作。

参数:

  • filename:文件名或路径。
  • mode:文件模式,指定打开方式。常见的值包括 ‘r’(读取),’w’(写入),’ab’(追加)。还可以使用 ‘rt’ 和 ‘wt’ 模式,分别用于读取和写入文本。
  • format:可选参数,指定压缩格式。可以是FORMAT_XZ、lzma.FORMAT_ALONE 或 lzma.FORMAT_RAW。默认值是 lzma.FORMAT_XZ。
  • check:可选参数,指定校验和类型。可以是CHECK_NONE、lzma.CHECK_CRC32、lzma.CHECK_CRC64 或 lzma.CHECK_SHA256。默认值是 lzma.CHECK_NONE。
  • preset:可选参数,指定压缩级别,范围从 0 到 9。默认值是 9(最高压缩级别)。
  • filters:可选参数,指定过滤器列表。

返回值:

  • 返回一个类文件对象,支持文件的读取和写入操作。

示例:

import lzma

# 写入压缩文件
with lzma.open('example.xz', 'wt') as f:
    f.write('This is an example of LZMA compression.')

# 读取压缩文件
with lzma.open('example.xz', 'rt') as f:
    content = f.read()
    print(content)  # 输出:This is an example of LZMA compression.

lzma.LZMAFile 类

lzma.LZMAFile 类提供了对 .xz 和 .lzma 文件的读取和写入操作,允许更细粒度的控制。

参数:

  • filename:文件名或路径。
  • mode:文件模式,指定打开方式(同open())。
  • format:可选参数,指定压缩格式。
  • check:可选参数,指定校验和类型。
  • preset:可选参数,指定压缩级别。
  • filters:可选参数,指定过滤器列表。

示例:

import lzma

# 使用 LZMAFile 类写入压缩文件
with lzma.LZMAFile('example2.xz', 'wb', preset=5) as f:
    f.write(b'This is another example of LZMA compression.')

# 使用 LZMAFile 类读取压缩文件
with lzma.LZMAFile('example2.xz', 'rb') as f:
    content = f.read()
    print(content.decode())  # 输出:This is another example of LZMA compression.

lzma.compress() 函数

lzma.compress() 函数用于将数据压缩为 .xz 格式的字节串。

参数:

  • data:要压缩的数据,应该是 bytes 类型。
  • format:可选参数,指定压缩格式。
  • check:可选参数,指定校验和类型。
  • preset:可选参数,指定压缩级别。
  • filters:可选参数,指定过滤器列表。

返回值:

  • 返回压缩后的数据,类型为 bytes。

示例:

import lzma

data = b'This is data to be compressed'
compressed_data = lzma.compress(data)
print(compressed_data)

lzma.decompress() 函数

lzma.decompress() 函数用于将 .xz 格式的压缩数据解压缩为原始数据。

参数:

  • data:要解压缩的数据,应该是 bytes 类型。

返回值:

  • 返回解压缩后的数据,类型为 bytes。窗体顶端窗体底端

zipfile:读写 ZIP 文件

zipfile 是 Python 标准库中的一个模块,提供了对 ZIP 格式的压缩和解压缩支持。ZIP 是一种流行的压缩格式,广泛用于压缩文件和目录。zipfile 模块允许在 Python 程序中创建、读取、写入和解压缩 ZIP 文件。

主要功能

  • 创建 ZIP 文件:将文件和目录打包成一个 ZIP 文件。
  • 读取 ZIP 文件:从 ZIP 文件中提取文件和目录。
  • 写入 ZIP 文件:将文件和目录添加到现有的 ZIP 文件中。
  • 流式处理:支持逐步处理 ZIP 文件中的内容。

注意事项

  • 压缩格式:zipfile 支持多种压缩格式,包括 DEFLATE、bzip2 和 LZMA,但不是所有格式都在所有平台上都可用。
  • 大文件支持:对于大于 4GB 的 ZIP 文件,需要设置 allowZip64=True。
  • 文本和二进制模式:在写入和读取文件时,可以选择文本模式(’rt’)或二进制模式(’rb’)。

zipfile 模块是处理 ZIP 文件的强大工具,支持从简单的文件压缩和解压缩到更复杂的操作,如压缩多层目录结构。

zipfile.ZipFile 类

zipfile.ZipFile 是主要的类,用于操作 ZIP 文件。它支持打开、读取、写入和关闭 ZIP 文件。

构造函数:

  • file:ZIP 文件的路径(字符串)或类文件对象。
  • mode:打开模式。常见的值包括 ‘r’(读取),’w’(写入),’a’(追加)。还可以使用 ‘r’ 模式来读取现有 ZIP 文件。
  • compression:可选参数,指定压缩方式。可以是ZIP_STORED(无压缩),zipfile.ZIP_DEFLATED(使用 DEFLATE 压缩),zipfile.ZIP_BZIP2(使用 bzip2 压缩),zipfile.ZIP_LZMA(使用 LZMA 压缩)。默认值是 zipfile.ZIP_DEFLATED。
  • allowZip64:可选参数,布尔值,指定是否允许处理超过 4GB 的 ZIP 文件。默认值是 True。

方法:

  • close():关闭 ZIP 文件。
  • extractall(path=None, members=None, pwd=None):解压 ZIP 文件中的所有文件到指定路径。
  • extract(member, path=None, pwd=None):解压 ZIP 文件中的单个文件到指定路径。
  • open(name, mode=’r’, pwd=None):以指定模式打开 ZIP 文件中的一个文件。
  • write(filename, arcname=None, compress_type=None):将文件添加到 ZIP 文件中。
  • writestr(zinfo_or_arcname, data, compress_type=None):将字符串数据添加到 ZIP 文件中。

示例:

import zipfile

# 创建一个 ZIP 文件并添加文件
with zipfile.ZipFile('example.zip', 'w') as zipf:
    zipf.write('file1.txt')  # 添加文件到 ZIP 文件中
    zipf.write('file2.txt', arcname='renamed_file2.txt')  # 使用指定名称添加文件

# 读取 ZIP 文件内容
with zipfile.ZipFile('example.zip', 'r') as zipf:
    zipf.extractall('extracted')  # 解压所有文件到 'extracted' 目录
    with zipf.open('file1.txt') as f:
        print(f.read().decode())  # 读取并打印 ZIP 文件中的内容

zipfile.ZipInfo 类

zipfile.ZipInfo 类提供了对 ZIP 文件中每个文件的详细信息,包括文件名、修改时间和文件压缩方法等。

构造函数:

  • filename:文件名。
  • date_time:文件的修改时间(元组,格式为 (year, month, day, hour, minute, second))。
  • compress_type:可选参数,指定压缩方法。

示例:

import zipfile
import datetime

info = zipfile.ZipInfo('new_file.txt', date_time=(2024, 8, 21, 12, 0, 0))
print(info.filename)  # 输出:new_file.txt
print(info.date_time)  # 输出:(2024, 8, 21, 12, 0, 0)

tarfile:读写 tar 档案文件

tarfile 是 Python 标准库中的一个模块,用于处理 TAR 文件格式。TAR 文件(Tape Archive)是一种用于打包多个文件的格式,通常用于存档和分发。在许多系统中,TAR 文件常与压缩技术(如 gzip 或 bzip2)一起使用,以减少存档文件的大小。

主要功能

  • 创建 TAR 文件:将多个文件和目录打包成一个 TAR 文件。
  • 读取 TAR 文件:从 TAR 文件中提取文件和目录。
  • 写入 TAR 文件:将文件和目录添加到现有的 TAR 文件中。
  • 流式处理:支持逐步处理 TAR 文件中的内容。

处理压缩 TAR 文件

tarfile 模块可以处理多种压缩格式的 TAR 文件,包括 gzip、bzip2 和 LZMA。压缩格式通过模式字符串指定,例如 ‘r:gz’、’r:bz2’ 和 ‘r:xz’。

创建压缩 TAR 文件

import tarfile

with tarfile.open('example.tar.gz', 'w:gz') as tar:
    tar.add('file1.txt')
读取压缩 TAR 文件:
import tarfile

with tarfile.open('example.tar.gz', 'r:gz') as tar:
    tar.extractall('extracted')

注意事项

  • 压缩支持:tarfile 支持 gzip、bzip2 和 LZMA 压缩,但需要相应的支持库(如 bz2 和 lzma)。
  • 大文件支持:tarfile 可以处理非常大的 TAR 文件,但请注意系统的内存限制。
  • 流式处理:tarfile 支持逐步处理 TAR 文件中的内容,适合处理大型文件或目录结构。

tarfile 模块提供了强大的功能来创建、读取和处理 TAR 文件,无论是简单的文件打包还是复杂的目录结构处理,都能满足需求。

tarfile.TarFile 类

tarfile.TarFile 是主要的类,用于操作 TAR 文件。它支持打开、读取、写入和关闭 TAR 文件。

构造函数:

  • name:TAR 文件的路径(字符串)或类文件对象。
  • mode:打开模式。常见的值包括 ‘r’(读取),’w’(写入),’a’(追加)。还可以使用 ‘r:gz’、’r:bz2’ 和 ‘r:xz’ 模式来处理压缩 TAR 文件。
  • fileobj:可选参数,指定一个类文件对象。
  • compress:可选参数,指定压缩类型。可以是 ‘gz’(gzip)、’bz2’(bzip2)或 ‘xz’(LZMA)。

方法:

  • close():关闭 TAR 文件。
  • extractall(path=None, members=None, numeric_owner=False):解压 TAR 文件中的所有文件到指定路径。
  • extract(member, path=None, set_attrs=True):解压 TAR 文件中的单个文件到指定路径。
  • open(name, mode=’r’):以指定模式打开 TAR 文件中的一个文件。
  • add(name, arcname=None, filter=None):将文件或目录添加到 TAR 文件中。
  • addfile(tarinfo, fileobj=None):将单个文件添加到 TAR 文件中。

mode 必须是 ‘filemode[:compression]’ 形式的字符串,其默认值为 ‘r’。 以下是模式组合的完整列表:

模式 动作
‘r’ or ‘r:*’ 打开和读取使用透明压缩(推荐)。
‘r:’ 打开和读取不使用压缩。
‘r:gz’ 打开和读取使用gzip 压缩。
‘r:bz2’ 打开和读取使用bzip2 压缩。
‘r:xz’ 打开和读取使用lzma 压缩。
‘x’ 或 ‘x:’ 创建tarfile不进行压缩。如果文件已经存在,则抛出 FileExistsError 异常。
‘x:gz’ 使用gzip压缩创建tarfile。如果文件已经存在,则抛出 FileExistsError 异常。
‘x:bz2’ 使用bzip2 压缩创建tarfile。如果文件已经存在,则抛出 FileExistsError 异常。
‘x:xz’ 使用lzma 压缩创建tarfile。如果文件已经存在,则抛出 FileExistsError 异常。
‘a’ or ‘a:’ 打开以便在没有压缩的情况下追加。如果文件不存在,则创建该文件。
‘w’ or ‘w:’ 打开用于未压缩的写入。
‘w:gz’ 打开用于 gzip 压缩的写入。
‘w:bz2’ 打开用于 bzip2 压缩的写入。
‘w:xz’ 打开用于 lzma 压缩的写入。

针对特殊的目的,还存在第二种 mode 格式: ‘filemode|[compression]’。 tarfile.open() 将返回一个将其数据作为数据块流来处理的 TarFile 对象:

模式 动作
‘r|*’ 打开 tar 块的 流 以进行透明压缩读取。
‘r|’ 打开一个未压缩的 tar 块的 stream 用于读取。
‘r|gz’ 打开一个 gzip 压缩的 stream 用于读取。
‘r|bz2’ 打开一个 bzip2 压缩的 stream 用于读取。
‘r|xz’ 打开一个 lzma 压缩 stream 用于读取。
‘w|’ 打开一个未压缩的 stream 用于写入。
‘w|gz’ 打开一个 gzip 压缩的 stream 用于写入。
‘w|bz2’ 打开一个 bzip2 压缩的 stream 用于写入。
‘w|xz’ 打开一个 lzma 压缩的 stream 用于写入。

示例:

import tarfile

# 创建一个 TAR 文件并添加文件
with tarfile.open('example.tar', 'w') as tar:
    tar.add('file1.txt')  # 添加文件到 TAR 文件中
    tar.add('file2.txt', arcname='renamed_file2.txt')  # 使用指定名称添加文件

# 读取 TAR 文件内容
with tarfile.open('example.tar', 'r') as tar:
    tar.extractall('extracted')  # 解压所有文件到 'extracted' 目录
    member = tar.getmember('file1.txt')
    with tar.extractfile(member) as f:
        print(f.read().decode())  # 读取并打印 TAR 文件中的内容

tarfile.TarInfo 类

tarfile.TarInfo 类提供了对 TAR 文件中每个文件的详细信息,包括文件名、修改时间和文件类型等。

构造函数:

  • name:文件名。

示例:

import tarfile

info = tarfile.TarInfo('new_file.txt')
info.size = 1234  # 设置文件大小
info.mtime = 1620000000  # 设置修改时间
print(info.name)  # 输出:new_file.txt
print(info.size)  # 输出:1234

tarfile.open() 函数

tarfile.open() 函数用于打开 TAR 文件,并返回一个 TarFile 对象。

参数:

  • name:TAR 文件的路径(字符串)或类文件对象。
  • mode:打开模式。包括 ‘r’(读取),’w’(写入),’a’(追加)等,还支持带压缩的模式,如 ‘r:gz’。
  • fileobj:可选参数,指定一个类文件对象。
  • compress:可选参数,指定压缩类型。

示例:

import tarfile

# 以读取模式打开 TAR 文件
with tarfile.open('example.tar', 'r') as tar:
    for member in tar.getmembers():
        print(member.name)  # 打印每个成员的名称

rar文件:rarfile

我们可以使用rarfile来解压.rar的文件,但是不支持用rarfile来压缩rar文件。rarfile以下unrar组件,但是使用pip install unrar安装后发现会报如下错误:

Couldn’t find path to unrar library…

这是因为 Python下的 unrar 还依赖了RAR官方的库

Windows的安装

  • 到RARLab官方下载库文件,https://www.rarlab.com/rar/UnRARDLL.exe,然后安装。
  • 安装是最好选择默认路径,一般在 C:\Program Files (x86)\UnrarDLL\ 目录下。
  • 添加环境变量,在系统变量中新建变量名UNRAR_LIB_PATH,如果是64位系统,就输入 C:\Program Files (x86)\UnrarDLL\x64\UnRAR64.dll,如果是32位系统就是 C:\Program Files (x86)\UnrarDLL\UnRAR.dll。
  • 确定保存环境变量后,在进行 pip install unrar 安装,这时代码再运行就不会报错了。

Linux的安装

  • 下载rar源文件:https://www.rarlab.com/rar/rarlinux-6.0.0.tar.gz
  • 解压安装包,进入安装包目录,编译安装,生成so 文件
  • 配置环境变量,完成后,在进行 pip install unrar 安装
# cd /usr/local/src/
# wget https://www.rarlab.com/rar/unrarsrc-6.0.3.tar.gz
# tar zxvf unrarsrc-6.0.3.tar.gz
# cd unrar
# make lib
# make install-lib  //生成libunrar.so 文件
# vim /etc/profile
export UNRAR_LIB_PATH=/usr/lib/libunrar.so
# source /etc/profile

代码示例:

import rarfile


def unrar(rar_file, dir_name):
    # rarfile需要unrar支持, linux下pip install unrar, windows下在winrar文件夹找到unrar,加到path里
    rarobj = rarfile.RarFile(rar_file.decode('utf-8'))
    rarobj.extractall(dir_name.decode('utf-8'))

7z文件:py7zr

要压缩和解压缩.7z文件需要用到py7zr组件。代码示例:

import py7zr

# 压缩
with py7zr.SevenZipFile("Archive.7z", 'r') as archive:
    archive.extractall(path="/tmp")

# 解压缩
with py7zr.SevenZipFile("Archive.7z", 'w') as archive:
    archive.writeall("target/")

参考链接:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注