在日常工作中,除了会涉及到使用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 part1") compressed_data += compressor.compress(b"data part2") 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'thisisthedatatobecompressed'
zlib.crc32()函数
zlib.crc32()函数计算CRC-32校验和,用于验证数据完整性。
参数:
- data:要计算校验和的数据,应该是bytes类型。
- crc:可选参数,表示初始CRC值。
返回值:
- 返回CRC-32校验和的整数值。
示例:
import zlib data = b"datatocheck" 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 块的 stream 以进行透明压缩读取。 |
‘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 文件的路径(字符串)或类文件对象。
- fileobj:可选参数,指定一个类文件对象。
- compress:可选参数,指定压缩类型。
mode:打开模式。包括 ‘r’(读取),’w’(写入),’a’(追加)等,还支持带压缩的模式,如 ‘r:gz’。
示例:
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/")
参考链接: