Python学习之路(31)——文件压缩解压缩zipfile和tarfile模块
一、zipfile模块
包含2个Exception类:
zipfile.BadZipFile和zipfile.LargeZipFile
3个类:
zipfile.ZipFile(filename[, mode[, compression[, allowZip64]]])):构造zipfile对象。mode:r、w、a表示不同的打开文件方式。compression:指出这个zipfile用什么压缩方法,默认ZIP_STORED,可选ZIP_DEFLATED。allZip64:bool变量,默认True表示可以创建小于2G的zip文件。
zipfile.PyZipFile(filename[, mode[, compression[, allowZip64[, optimize]]]])):构造包含Python库文件的zipfile对象。
zipfile.ZipInfo():用于表示归档文件中的一个成员信息。zipfile.ZipInfo类的实例可以通过ZipFile对象的getinfo()和infolist()方法获取。
多个函数和方法:
zipfile.is_zipfile(filename):判断filename是否是一个有效的ZIP文件,并返回一个布尔类型的值。
zipfile.ZIP_STORED:表示一个压缩归档成员
zipfile.ZIP_DEFLATED:表示普通的ZIP压缩方法,需要zlib模块的支持
zipfile.ZIP_BZIP2:表示BZIP2压缩方法,需要bz2模块的支持
zipfile.ZIP_LZMA:表示LZMA压缩方法,需要lzma模块的支持
1、zipfile.ZipFile类
构造方法: class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True)
实例方法:
printdir():打印该归档文件的内容
extract(member, path = None, pwd = None):从归档文件中展开一个成员到指定目录,member必须是一个晚走的文件名称或ZipInfo对象,path指定展开的路径目录,pwd用于加密文件的密码
extractall(path = None, members = None, pwd = None):从归档文件展开所有成员到指定目录,members必须是namelist()返回的list的一个子集
infolist():返回一个与每一个归档成员对于的ZipInfo对象的列表
namelist():返回归档成员的名称列表
getinfo(name):返回一个包含压缩成员name相关信息的ZipInfo对象,如果name没有被包含在该压缩文档中,将会引发KeyError异常
open(name, mode = 'r', pwd = None):将归档文件中的一个成员作为file-like对象展开,name是归档文件中的文件名或一个ZipInfo对象
close():关闭该压缩文件,退出程序前必须调用close()方法
setpassword(ows):设置pwd作为展开加密文件的默认密码
testzip():读取归档文件中所有文件并检查它们的完整性,返回第一个被损坏的文件名称,或者None。对已关闭的ZipFile调用testzip()将会引发RuntimeError
read(name, pwd = None):返回归档文件中name所指定的成员文件的字节。name是归档文件中的文件名称或一个ZipInfo对象。该归档文件必须以读(r)或追加(a)的模式打开。如果设置了pwd参数,则其将会覆盖setpassword(pwd)方法设置的默认密码。对一个已经关闭的ZipFile调用read()方法将会引发RuntimeError
write(filename, arcname = None, compress_type = None):将filename文件写入归档文件,可以通过arcname指定新文件名(需要注意的是文件名中磁盘盘符和开头的路径分隔符都会被移除);compress_type表示压缩方法,如果指定了该参数则会覆盖ZipFile构造方法中的compression参数指定的值;要调用此方法,归档文件必须以'w', 'a'或'x'模式打开,如果对以'r'模式打开的ZipFile调用write()方法或者对已关闭的ZipFile调用write()方法将会引发RuntimeError
writestr(zinfo_or_arcname, date, compress_type = None):将一个字节串写入归档文件;zinfo_or_arcname可以是归档文件中的文件名称,也可以是一个ZipInfo实例
以下是实例:
压缩单个文件:
import zipfile
import os
with zipfile.ZipFile('log.zip', 'w') as z:
z.write('log.log')
解压文件:
with zipfile.ZipFile('log.zip', 'r') as z:
print(z.namelist()) # 查看压缩包中的文件列表
print(z.read(z.namelist()[0])) # 读出来压缩包中的第一个文件的内容打印到屏幕,也可保存到文件中
# z.extractall('aaa') # 解压,可设置解压路径
# z.extract('log.log') # 解压,可选择解压某个文件
z.extractall() # 解压全部
压缩某个目录下所有文件:
def compress_file(zipfilename, dirname): # zipfilename是压缩包名字,dirname是要打包的目录
if os.path.isfile(dirname):
with zipfile.ZipFile(zipfilename, 'w') as z:
z.write(dirname)
else:
with zipfile.ZipFile(zipfilename, 'w') as z:
for root, dirs, files in os.walk(dirname):
for single_file in files:
if single_file != zipfilename:
filepath = os.path.join(root, single_file)
z.write(filepath)
compress_file('a.zip', '.') #压缩当前目录下所有文件,打包成文件a.zip
添加文件到zip包中:
def addfile(zipfilename, dirname):
if os.path.isfile(dirname):
with zipfile.ZipFile(zipfilename, 'a') as z:
z.write(dirname)
else:
with zipfile.ZipFile(zipfilename, 'a') as z:
for root, dirs, files in os.walk(dirname):
for single_file in files:
if single_file != zipfilename:
filepath = os.path.join(root, single_file)
z.write(filepath)
addfile('a.zip', 'test.txt')
查看压缩包文件
def viewfile(zipfilename):
with zipfile.ZipFile(zipfilename, 'r') as z:
print(z.namelist())
viewfile('a.zip')
2、zipfile.PyZipFile类
构造方法:class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)
比ZipFile构造函数多出一个附加参数optimize。
实例方法:
与ZipFile的实例方法一致,多了一个writepy()方法:
writepy(pathname, basename='', filterfunc=None):所有*.py文件并将相应的文件添加到归档文件
optimize:默认为-1,表示这里的包含文件是一个*.pyc文件,如果需要会进行编译;0,1,2,表示只有那些同样优化等级(参考compile()函数)的文件会添加到归档压缩文件。
以下是示例:
>>> zf = PyZipFile('myprog.zip')
>>> def notests(s):
... fn = os.path.basename(s)
... return (not (fn == 'test' or fn.startswith('test_')))
>>> zf.writepy('myprog', filterfunc=notests)
3、zipfile.ZipInfo类
构造方法:class zipfile.ZipInfo(finame = 'NoName', date_time = (1980, 1, 1, 0, 0))
实例属性:

二、tarfile模块
包含多个Exception类:
tarfile.TarError、tarfile.ReadError、tarfile.CompressionError、tarfile.StreamError、tarfile.ExtractError、tarfile.HeaderError
2个主要类:(与zipfile一致)
tarfile.TarFile:创建一个TarFile文件,提供操作一个tar归档文件的接口
tarfile.TarInfo:一个TarInfo对象表示TarFile中的一个成员。TarInfo对象中除了保存了一个文件所需要的所有属性(比如:文件类型、文件大小、修改时间、权限、属主等)之外,它还提供了一些用于判断其文件类型的方法。需要注意的是,它不包含文件的数据。TarInfo对象可以通过TarFile的getmember()、getmembers()和gettarinfo()方法获取。
方法和属性:
tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs):为指定的路径名name返回一个TarFile对象
tarfile.is_tarfile(name):如果name是一个tarfile模块可以读的tar归档文件则返回True,否则返回False
tarfile.ENCODING:表示默认字符编码,在windows上为'utf-8',否则为sys.getfilesystemencoding()的返回值
tarfile.USTAR_FORMAT:POSIX.1-1922(ustar)格式
tarfile.GUN_FORMAT:GUN tar格式
tarfile.PAX_FORMAT:POSIX.1-2001(pax)格式
tarfile.DEFAULT_FORMAT:表示创建归档的默认格式,当前值为GUN_FORMAT
1、tarfile.TarFile类
构造方法:
class tarfile.TarFile(name=None, mode='r', fileobj=None, format=DEFAULT_FORMAT, tarinfo=TarInfo, dereference=False, ignore_zeros=False, encoding=ENCODING, errors='surrogateescape', pax_headers=None, debug=0, errorlevel=0)
参数说明:
- 下面所有的参数都是可选的,且可以作为TarFile类实例的属性被访问;
- name:指定归档文件路径名称;如果fileobj参数被指定该参数可以被忽略,且如果fileobj的name属性存在则取该属性的值;
- mode::指定文档打开模式;r:读取已存在的归档,a:向一个已存在的文件追加数据,w:创建一个新的文件覆盖已经存在的文件,x:如果文件不存在才创建一个新文件
- fileobj:指定要读写的文件对象;如果指定了该参数,那么mode参数的值会被fileojb的mode属性值覆盖,且name参数可以被忽略;
- format:用于控制归档格式;必须是这些值中的一个:USTAR_FORMAT, GUN_FORMAT, PAX_FORMAT
- tarinfo:
- dereference:如果该参数值为False,则直接将软连接和硬链接添加到归档中;如果该参数值为True,则将目标文件的内容添加到归档中;
- ignore_zeros:该参数值对读取连续或损坏的归档时有效;如果值为False,则会把一个空block当做归档文件的结束位置;如果值为Ture,则会跳过空或无效的block并尝试获取尽可能多的归档成员
- debug:设置调试级别,可取值为0(不输出任何调试信息)至 3(输出所有调试信息),调试信息会被写到sys.stderr;
- errorlevel:设置错误级别;如果值为0,则使用TarFile.extract()方法时出现的所有错误都会被忽略,否则,如果debug可用,这些信息会作为错误信息出现在debug输出中。如果值为1,则所有fatal错误将会引发OSError;如果值为2,则所有非fatal错误将会引发TarError;
- encoding 和 errors:这两个参数定义了读写归档时使用的字符编码和如何处理转换错误
实例方法:
add(name, arcname=None, recursive=True, exclude=None, *, filter=None)
addfile(tarinfo, fileobj=None)
getmemeber(name)
getmemebers()
getnames()
list(verbose=True, *, memebers=None)
next()
extractall(path=".", memebers=None, *, numeric_owner=False)
extract(member, path="", set_attrs=True, *, numberic_owner=False)
extractfile(member)
gettarinfo(name=None, arcname=None, fileobj=None)
close()
示例:
压缩文件
import tarfile
import os
with tarfile.open('a.tar', 'w') as tar:
tar.add('log.log', arcname='log.log')
tar.add('test.txt', arcname='test.txt')
解压文件
with tarfile.open('a.tar', 'r') as tar:
print(tar.getmembers()) # 查看压缩包内文件成员
# tar.extract('test.txt') # 可选择解压某个文件
# tar.extractall('ccc') # 可设置解压路径
tar.extractall() # 解压全部
压缩某个目录下所有文件
def compress_file(tarfilename, dirname): # tarfilename是压缩包名字,dirname是要打包的目录
if os.path.isfile(dirname):
with tarfile.open(tarfilename, 'w') as tar:
tar.add(dirname)
else:
with tarfile.open(tarfilename, 'w') as tar:
for root, dirs, files in os.walk(dirname):
for single_file in files:
# if single_file != tarfilename:
filepath = os.path.join(root, single_file)
tar.add(filepath)
compress_file('test.tar', 'test.txt')
compress_file('t.tar', '.')
添加文件到tar包中
def addfile(tarfilename, dirname): # tarfilename是压缩包名字,dirname是要打包的目录
if os.path.isfile(dirname):
with tarfile.open(tarfilename, 'a') as tar:
tar.add(dirname)
else:
with tarfile.open(tarfilename, 'a') as tar:
for root, dirs, files in os.walk(dirname):
for single_file in files:
# if single_file != tarfilename:
filepath = os.path.join(root, single_file)
tar.add(filepath)
addfile('t.tar', 'ttt.txt')
addfile('t.tar', 'ttt')
2、tarfile.TarInfo类
构造方法:class tarfile.TarInfo(name="")
类方法:
classmethod TarInfo.frombuf(buf, encoding, errors):从字符串缓冲区创建一个TarInfo对象并返回
classmethod TarInfo.fromtarfile(tarfile):从TarFile对象中读取一个成员并将其作为TarInfo对象返回
对象方法和属性:

浙公网安备 33010602011771号