手机版
你好,游客 登录 注册
背景:
阅读新闻

Python之文件与目录操作(os、zipfile、tarfile、shutil)

[日期:2017-05-28] 来源:Linux社区  作者:yyds [字体: ]

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文件归档

工程目录结构

MYPROGhello.py
│
├─accountlogin.py
│      __init__.py
│
├─testtest_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()
linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款