在日常工作中,除了会涉及到使用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/")
参考链接: