4. zipfile.PyZipFile类
PyZipFile类用于创建包含Python库的ZIP存档
类的构造方法
PyZipFile的构造方法与ZipFile的构造方法参数基本一致,只是多了一个optimize参数
class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)
说明:
Python 3.2 新增optimize参数
Python 3.4 allowZip64默认值改为True
实例方法列表
PyZipFile类的实例方法与ZipFile类的实例方法一致,只是多了一个writepy()方法:
# 搜索*.py文件并将相应的文件添加到归档文件
writepy(pathname, basename='', filterfunc=None)
说明:
如果该PyZipFile实例的构造方法中的optimize参数没有被给出,或者被设置为-1,那么这里所指的“相应文件”是一个*.pyc文件,如果需要,会进行编译。
如果该PyZipFile实例的构造方法中的optimize参数值为0, 1或2,只有那些同样优化等级(参考compile()函数)的文件会被添加到归档文件。
如果pathname是一个文件,文件名必须以.py结尾,且仅仅是这些(*.py[co])文件被添加,不包含路径信息;如果pathname是一个文件,但是不以.py结尾,将会引发RuntimeError。
如若pathname是一个目录,且这个目录不是一个package目录,则所有的(不包含路径信息).py[co]文件将被添加;如果pathname是一个package目录,则所有的.py[co]都会作为一个文件路径被添加到这个package名称下,并且如果任何子文件夹是package目录,则会被递归添加。
basename仅供内部使用
filterfunc参数如果被给出,则其必须是一个只接收一个字符串参数的函数。每个文件路径在被添加到归档之前都会作为参数传递给filterfunc所指定的函数。如果filterfunc返回False,则这个路径将不会被添加,如果是一个目录,则它的内容将会被忽略。
filterfunc参数是Python 3.4新加的。
5. zipfile.ZipInfo类
ZipInfo类的实例时通过ZipFile对象的getinfo()和infolist()方法返回的,其本身没有对外提供构造方法和其他方法。每一个ZipInfo对象存储的是ZIP归档文件中一个单独成员的相关信息,因此该实例仅仅提供了以下属性用于获取归档文件中成员的信息。
属性名称描述
ZipInfo.filename
文件名称
ZipInfo.date_time
文件的最后修改日期和时间,这是一个tuple:(年, 月, 日, 时, 分, 秒)
ZipInfo.compress_type
压缩类型
ZipInfo.comment
文件备注
ZipInfo.extra
扩展字段数据
ZipInfo.create_system
ZIP归档的创建系统
ZipInfo.create_version
创建ZIP归档的PKZIP版本
ZipInfo.extract_version
展开ZIP归档所需要的PKZIP版本
ZipInfo.reserved
必须是0
ZipInfo.flag_bits
ZIP标志位
ZipInfo.volume
文件头的Volume号码
ZipInfo.internal_attr
内部属性
ZipInfo.external_attr
外部属性
ZipInfo.header_offset
文件头的字节偏移量
ZipInfo.CRC
未压缩文件的CRC-32
ZipInfo.compress_size
压缩后的数据大小
ZipInfo.file_size
未压缩文件大小
6. 实例
实例1:文件归档与解压缩操作
import zipfile
# 归档
z = zipfile.ZipFile('test.zip', 'w')
z.write('a.txt')
z.write('b.log')
z.close()
# 解压
z = zipfile.ZipFile('test.zip', 'r')
z.extractall()
z.close()
# 文件信息读取
z = zipfile.ZipFile('test.zip', 'r')
z.printdir()
z.namelist()
z.infolist()
zinfo = z.getinfo('a.txt')
print(zinfo.filename)
print(zinfo.date_time)
print(zinfo.file_size)
print(zinfo.compress_size)
z.close()
实例2:python文件归档
工程目录结构
MYPROG
│ hello.py
│
├─account
│ login.py
│ __init__.py
│
├─test
│ test_print.py
│
└─tools
tool.py
代码
import zipfile
pyz = zipfile.PyZipFile('myprog.zip', 'w')
pyz.writepy('MYPROG/hello.py')
pyz.writepy('MYPROG/tools')
pyz.writepy('MYPROG/test')
pyz.writepy('MYPROG/account')
pyz.close()
pyz.printdir()
输出结果:
File Name Modified Size
hello.pyc 2017-02-16 11:46:20 130
tool.pyc 2017-02-16 11:55:44 135
test_print.pyc 2017-02-16 11:55:48 140
account/__init__.pyc 2017-02-16 11:55:54 118
account/login.pyc 2017-02-16 11:55:54 138
四、文件打包(tarfile模块)
tarfile模块用于读写tar归档文件,它也可以同时实现压缩功能。与zipfile模块相比,tarfile模块 可以直接将一个目录进行归档并压缩。另外,tarfile模块提供的api更“面向对象”化。
1. tarfile模块包含的两个主要的类
类名描述
TarFile
该类提供了操作一个tar归档的接口
TarInfo
一个TarInfo对象代表TarFile中的一个成员
这两个类的关系类似于zipfile.ZipFile与zipfile.ZipInfo的关系,TarInfo对象中保存了一个文件所需要的所有属性,比如:文件类型、文件大小、修改时间、权限、属主等,但是它不包含文件的数据。
2.tarfile模块包含的方法和常量
方法/常量名描述
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
关于open()函数的说明:
tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)
该函数用于创建并返回一个TarFile对象。Python官方文档不建议直接使用TarFile的构造方法构建示例,而是建议使用这个open()函数来操作TarFile对象。下面我们来说说它的参数:
name:表示要创建的归档文件的名称,通常为.tar,.tar.gz, .tar.bz2,.tar.xz,具体后缀应该与mode的值对应
mode:必须是一个filemode[:compression]格式的字符串,默认值为'r'。filemode的可取值为'r', 'w', 'a', 'x'; compression表示压缩方式,可取值为'gz', 'bz2', 'xz';需要注意的是'a:gz', 'a:bz2', 'a:xz'是不允许的格式。
下面是mode所有可取值的列表:
mode行为
'r:'
以读模式打开一个未压缩的归档文件(通常后缀为*.tar)
'r:gz'
以读模式打开一个通过gzip方式进行压缩的归档文件(通常后缀为*.tar.gz)
'r:bz2'
以读模式打开一个通过bzip2方式进行压缩的归档文件(通常后缀为*.tar.bz2)
'r:xz'
以读模式打开一个通过lzma方式进行压缩的归档文件(通常后缀为*.tar.xz)
'r' 或 'r:*'
以读模式打开归档文件,可以打开以上任意方式压缩的归档文件,且会自动判断应该使用的压缩方式。推荐使用这个mode。
'w'或'w:'
以写模式打开一个不进行压缩的归档文件
'w:gz'
以写模式打开一个以gzip方式进行压缩的归档文件
'w:bz2'
以写模式打开一个以bzip2方式进行压缩的归档文件
'w:xz'
以写模式打开一个以lzma方式进行压缩的归档文件
'x'或'x:'
同'w'或'w:',但是如果归档文件已经存在会引发FileExistsError
'x:gz'
同'w:gz',但是如果归档文件已经存在会引发FileExistsError
'x:bz2'
同'w:bz2'',但是如果归档文件已经存在会引发FileExistsError
'x:xz'
同'w:xz',但是如果归档文件已经存在会引发FileExistsError
'a'或'a:'
以追加方式打开一个不进行压缩的股低昂文件,如果文件不存在则创建
对于 'w:gz', 'r:gz', 'w:bz2', 'r:bz2', 'x:gz', 'x:bz2'这些模式, tarfile.open() 接收关键字参数 compresslevel (默认值为9) 来指定该归档文件的压缩级别.
3.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:这两个参数定义了读写归档时使用的字符编码和如何处理转换错误
类方法
classmethod TarFile.open(...)
这是个可选的构造方法,实际上tarfile.open()函数就是这个函数的快捷方式
实例方法
# 将name文件添加到归档;name可以是任何类型的文件(如:目录,fifo管道,软连接等),arcname用于指定name文件被添加到归档后的新名字,arcname默认为None,表示文件名称保持不变。recursive值为Trur表示如果name文件是一个目录,则该目录中文件会被递归添加到归档中。exclude参数如果被指定,则其值必须是一个接受文件名作为参数的函数,且该函数必须返回一个布尔值,返回值为True表示该文件将不会被添加到归档中,反之则会被添加到归档中。filter参数如果被提供,则它必须是一个关键字参数且它应该是一个接收TarInfo对象作为参数的函数,该函数应该返回被修改后的TarInfo对象;如果它的返回值为None,那么该TarInfo将不会被添加到归档中。需要说明的是,从Python 3.2开始 exclude参数被废弃,新增filter参数,且使用filter代替exclude的功能
add(name, arcname=None, recursive=True, exclude=None, *, filter=None)
# 添加指定TarInfo对象到归档中。如果fileobj被提供,它应该是一个二进制文件,且会从这个二进制文件中读取tarinfo.size字节的内容添加到这个归档中。你可以通过gettarinfo()直接创建TarInfo对象
addfile(tarinfo, fileobj=None)
# 返回归档成员name对应的TarInfo对象(类似zipfile.ZipFile实例的getinfo(name)方法);如果name无法在归档中找到会引发KeyError,如果一个成员在归档中不仅出现一次,则最后一次出现将被当做最新版本
getmemeber(name)
# 将归档中所有成员作为TarInfo对象的列表返回(类似zipfile.ZipFile实例的infolist()方法)
getmemebers()
# 将归档中所有成员的名称以列表形式返回(类似zipfile.ZipFile实例的namelist()方法)
getnames()
# 打印内容列表到sys.stdout(类似zipfile.ZipFile实例的printdir()方法);如果verbose值为False,则仅打印成员的名称;如果verbose值为True,则打印的内容类似'ls -l'命令的输出;如果可选参数members被给出,它必须是getmembers()方法返回的列表的子集;Python 3.5新增memebers参数
list(verbose=True, *, memebers=None)
# (当以读模式打开归档时)该方法以TarInfo对象的形式返回归档的下一个成员,如果已经没有可用的成员则返回None
next()
# 将归档中的所有成员提取到当前工作目录或path参数指定的目录;如果memebers参数被指定,它必须是getmemebers()函数返回列表的子集;所有者、更改时间和权限等目录信息会在所有成员被提取后设置;如果numberic_owner值为True,将使用tarfile的uid和gid数字来设置提取后文件的属主和属组,否则将使用叔叔和属组的名字。Python 3.5中新增了number_owner参数
extractall(path=".", memebers=None, *, numeric_owner=False)
# 提取归档中的一个成员到当前工作目录或path指定的目录,member参数的值可以是一个文件名或一个TarInfo对象;Python 3.2添加了set_attrs参数,Python 3.5添加了numberic_owner参数
extract(member, path="", set_attrs=True, *, numberic_owner=False)
# 提取归档中的一个成员为一个文件对象,member参数的值可以是一个文件名或一个TarInfo对象;从Python 3.3开始,如果member是一个普通文件或是一个链接,该方法会返回一个io.BufferedReader对象,否则会返回None
extractfile(member)
# 通过对现有文件执行os.stat()操作的结果创建一个TarInfo对象;这个已存在的文件可以通过文件名name来指定,也而已通过文件对象fileobj来指定(文件描述符),文件被添加到归档后的文件名取值优先级为:arcname参数的值,fileobj.name属性的值,name参数的值;你可以在通过addfile()方法将该文件添加到归档之前对TarInfo对象的一些属性值进行修改
gettarinfo(name=None, arcname=None, fileobj=None)
# 关闭TarFile对象
close()