tarfile
2.3版本的新功能。
源代码: Lib / tarfile.py
该tarfile
模块可以读写tar档案,包括使用gzip或bz2压缩的档案。使用该zipfile
模块读取或写入.zip
文件,或shutil中的更高级别的函数。
一些事实和数字:
- 如果各个模块可用,则读取和写入
gzip
并bz2
压缩归档。
- 读/写支持POSIX.1-1988(ustar)格式。
- 对GNU tar格式的读/写支持,包括长名称和长链接扩展,对稀疏扩展的只读支持。
- 读/写支持POSIX.1-2001(pax)格式。
2.6版本中的新功能。
- 处理目录,常规文件,硬链接,符号链接,fifo,字符设备和块设备,并能够获取和恢复文件信息,如时间戳,访问权限和所有者。
版本3.3中更改:增加了对lzma
压缩的支持。
tarfile.open
(name = None,mode ='r',fileobj = None,bufsize = 10240,** kwargs)
TarFile
为路径名称返回一个对象。有关TarFile
允许的对象和关键字参数的详细信息,请参阅TarFile对象。
模式必须是表单的字符串'filemode[:compression]'
,它默认为'r'
。以下是模式组合的完整列表:
模式 | 行动 |
---|---|
'r' or 'r:*' | 透明压缩打开(推荐)。 |
'r:' | 打开阅读专门没有压缩。 |
'r:gz' | 用gzip压缩打开。 |
'r:bz2' | 用bzip2压缩打开阅读。 |
'r:xz' | 打开阅读lzma压缩。 |
'x' 要么 'x:' | 创建一个tar文件而不压缩。FileExistsError如果它已经存在,则引发异常。 |
'x:gz' | 用gzip压缩创建一个tar文件。FileExistsError如果它已经存在,则引发异常。 |
'x:bz2' | 用bzip2压缩创建一个tar文件。FileExistsError如果它已经存在,则引发异常。 |
'x:xz' | 用lzma压缩创建一个tar文件。FileExistsError如果它已经存在,则引发异常。 |
'a' or 'a:' | 打开后不需要压缩。如果该文件不存在,则会创建该文件。 |
'w' or 'w:' | 打开未压缩的文字。 |
'w:gz' | 打开gzip压缩文字。 |
'w:bz2' | 打开bzip2压缩文字。 |
'w:xz' | 打开lzma压缩文字。 |
请注意'a:gz'
,'a:bz2'
或'a:xz'
不可能。如果模式 不适合打开某个(压缩)的文件进行读取,ReadError
则会引发。使用模式 'r'
来避免这种情况。如果不支持压缩方法,CompressionError
则会引发。
如果指定了fileobj,那么它将用作 以二进制模式打开的名称文件对象的替代方案。它应该在位置0。
对于模式'w:gz'
,'r:gz'
,'w:bz2'
,'r:bz2'
,'x:gz'
, 'x:bz2'
,tarfile.open()
接受关键字参数compresslevel(默认9
)来指定该文件的压缩级别。
对于特殊用途,对于第二格式模式: 'filemode|[compression]'
。 tarfile.open()
将返回一个TarFile
对象,它将数据作为一个块流进行处理。文件不会随意查找。如果给定,fileobj可能是任何具有read()
或write()
方法的对象 (取决于模式)。bufsize 指定块大小,默认为字节。将此变体与例如套接字文件对象或磁带设备结合使用。但是,这样的对象是有限的,因为它不允许随机访问,请参阅示例。目前可能的模式:20
*
512sys.stdin
TarFile
模式 | 行动 |
---|---|
'r|*' | 透明压缩打开一个tar块流供阅读。 |
'r|' | 打开一个未压缩的焦油块流供阅读。 |
'r|gz' | 打开一个gzip压缩流供阅读。 |
'r|bz2' | 打开一个bzip2压缩流供阅读。 |
'r|xz' | 打开一个lzma压缩流供阅读。 |
'w|' | 写一个未压缩的流。 |
'w|gz' | 打开gzip压缩流进行写入。 |
'w|bz2' | 打开一个bzip2压缩流进行写入。 |
'w|xz' | 打开一个lzma压缩流进行写入。 |
类tarfile.TarFile
阅读和编写tar档案的类。不要直接使用这个类:tarfile.open()
改为使用。请参阅TarFile对象。
tarfile.is_tarfile
(名字)
True
如果名称是一个tar档案文件,则返回该tarfile
模块可以读取的内容。
该tarfile
模块定义了以下例外情况:
异常tarfile.TarError
所有tarfile
例外的基类。
异常tarfile.ReadError
当tar档案被打开时引发,或者不能被tarfile
模块处理 或者以某种方式无效。
异常tarfile.CompressionError
当不支持压缩方法或无法正确解码数据时引发。
异常tarfile.StreamError
针对流式TarFile
物体的典型局限性而提出。
异常tarfile.ExtractError
在使用时引发非致命错误TarFile.extract()
,但仅 在使用时引发。TarFile.errorlevel==
2
异常tarfile.HeaderError
TarInfo.frombuf()
如果获取的缓冲区无效,则会引发此问题。
以下常量在模块级别可用:
tarfile.ENCODING
默认字符编码:'utf-8'
在Windows上,sys.getfilesystemencoding()
否则返回值 。
以下每个常量都定义了tarfile
模块能够创建的tar归档格式 。有关详细信息,请参阅支持的焦油格式部分
tarfile.USTAR_FORMAT
POSIX.1-1988(ustar)格式。
tarfile.GNU_FORMAT
GNU tar格式。
tarfile.PAX_FORMAT
POSIX.1-2001(pax)格式。
tarfile.DEFAULT_FORMAT
创建档案的默认格式。这是目前GNU_FORMAT
。
另请参阅
模 zipfile
zipfile
标准模块的文档。归档操作由标准shutil
模块提供的更高级归档工具的文档。GNU tar手册,基本Tar格式tar归档文件的文档,包括GNU tar扩展。
TarFile对象
该TarFile
对象提供了一个tar档案的接口。tar档案是一系列块。一个档案成员(一个存储文件)由一个头块和数据块组成。可以将文件存储在tar归档文件中多次。每个存档成员都由一个TarInfo
对象表示,有关详细信息,请参阅TarInfo对象。
一个TarFile
对象可以在with
语句中用作上下文管理器。块完成后它会自动关闭。请注意,如果发生例外情况,开放撰写的档案将不会最终确定; 只有内部使用的文件对象将被关闭。有关用例,请参阅 示例部分。
3.2版新增功能:增加了对上下文管理协议的支持。
类tarfile.TarFile
(名=无,模式= 'R',FileObj文件=无,格式= DEFAULT_FORMAT,tarinfo = TarInfo,解除引用=假,ignore_zeros =假,编码= ENCODING,误差= 'surrogateescape',pax_headers =无,调试= 0,errorlevel = 0)
以下所有参数都是可选的,并且可以作为实例属性来访问。
name是存档的路径名。名称可能是一个类似于路径的对象。如果给出fileobj,它可以被忽略。在这种情况下,如果文件对象name
存在,则使用该文件对象的属性。
模式是'r'
从现有存档读取'a'
数据,将数据附加到现有文件,'w'
创建覆盖现有文件的新文件,或'x'
仅在尚不存在的情况下创建新文件。
如果给出fileobj,它将用于读取或写入数据。如果可以确定,模式会被fileobj的模式覆盖。将从位置0使用fileobj。
注意
关闭时fileobj未TarFile
关闭。
格式控制存档格式。它必须是常量之一 USTAR_FORMAT
,GNU_FORMAT
或者PAX_FORMAT
是在模块级定义的。
该tarinfo参数可以用来替换缺省TarInfo
使用不同的一类。
如果解除引用,则为False
档案添加符号和硬链接。如果是True
,请将目标文件的内容添加到存档中。这对不支持符号链接的系统没有影响。
如果ignore_zeros是False
,则将空块视为归档的结尾。如果是这样True
,跳过空(和无效)块,尽量争取尽可能多的成员。这仅用于阅读级联或损坏的档案。
调试可以设置从0
(无调试消息)到3
(所有调试消息)。消息被写入sys.stderr
。
如果错误级别是0
,则使用时将忽略所有错误TarFile.extract()
。不过,在调试启用时,它们在调试输出中显示为错误消息。如果1
所有致命错误都作为OSError
例外提出。如果2
所有非致命错误都作为TarError
例外提出。
该编码和错误参数定义用于读取或写入档案,以及如何转换错误将要处理的字符编码。默认设置适用于大多数用户。有关详细信息,请参阅Unicode问题部分。
所述pax_headers参数是将要添加作为PAX全局头如果串的一个可选的字典的格式是PAX_FORMAT
。
在3.2版本中更改:使用'surrogateescape'
作为默认的错误说法。
改变在3.5版本:将'x'
加入(独家创作)模式。
改变在3.6版本:该名称参数接受路径状物体。
classmethodTarFile.open
(...)
替代构造函数。这个tarfile.open()
函数实际上是这个classmethod的一个捷径。
TarFile.getmember
(名字)
返回一个TarInfo
成员名称的对象。如果在存档中找不到名称,KeyError
则会提出。
注意
如果一个成员在存档中多次出现,则认为其最后一次出现是最新的版本。
TarFile.getmembers
()
将档案成员作为TarInfo
对象列表返回。该列表与归档中的成员具有相同的顺序。
TarFile.getnames
()
返回成员名单。它与返回的列表具有相同的顺序getmembers()
。
TarFile.list
(verbose = True,*,members = None)
打印目录到sys.stdout
。如果详细是False
,则仅打印成员的名称。如果是True
,则产生与ls -l类似的输出。如果给出可选成员,它必须是返回列表的子集getmembers()
。
版本3.5中已更改:添加了成员参数。
TarFile.next
()
TarInfo
当TarFile
打开阅读时,将档案的下一个成员作为对象 返回。None
如果没有更多可用,则返回。
TarFile.extractall
(path =“。”,members = None,*,numeric_owner = False)
将存档中的所有成员提取到当前工作目录或目录路径。如果给出可选成员,它必须是返回列表的子集getmembers()
。在提取所有成员之后设置所有者,修改时间和权限等目录信息。这样做是为了解决两个问题:每次在其中创建文件时,都会重置目录的修改时间。而且,如果一个目录的权限不允许写入,解压文件将失败。
如果numeric_owner是True
,则tarfile中的uid和gid数字用于设置提取文件的所有者/组。否则,使用tarfile中的命名值。
警告
切勿在未事先检查的情况下从不受信任的来源提取档案。有可能文件是在路径之外创建的,例如具有"/"
以两个点开头的绝对文件名或具有两个点的文件名的成员".."
。
版本3.5中已更改:添加了numeric_owner参数。
改变在3.6版本:该路径参数接受路径状物体。
TarFile.extract
(member,path =“”,set_attrs = True,*,numeric_owner = False)
使用其全名将存档中的成员提取到当前工作目录。其文件信息尽可能准确地提取。成员 可能是文件名或TarInfo
对象。您可以使用路径指定不同的目录。路径可能是一个类似于路径的对象。文件属性(owner,mtime,mode)被设置,除非set_attrs为false。
如果numeric_owner是True
,则tarfile中的uid和gid数字用于设置提取文件的所有者/组。否则,使用tarfile中的命名值。
注意
extract()
方法不考虑几个提取问题。在大多数情况下,您应该考虑使用该extractall()
方法。
警告
请参阅警告extractall()
。
版本3.2中已更改:添加了set_attrs参数。
版本3.5中已更改:添加了numeric_owner参数。
改变在3.6版本:该路径参数接受路径状物体。
TarFile.extractfile
(成员)
从存档中提取成员作为文件对象。成员可能是文件名或TarInfo
对象。如果成员是常规文件或链接,io.BufferedReader
则返回一个 对象。否则,None
返回。
版本3.3中更改:返回一个io.BufferedReader
对象。
TarFile.add
(name,arcname = None,recursive = True,*,filter = None)
将文件名添加到存档。名称可以是任何类型的文件(目录,fifo,符号链接等)。如果给定,则arcname为档案中的文件指定替代名称。目录默认递归添加。这可以通过设置递归来 避免False
。递归按排序顺序添加条目。如果给出了过滤器,它应该是一个接受TarInfo
对象参数并返回已更改TarInfo
对象的函数。如果它返回,则 None
该TarInfo
对象将从档案中排除。见实施例中的示例。
在版本3.2中更改:添加了过滤器参数。
在版本3.7中更改:递归按排序顺序添加条目。
TarFile.addfile
(tarinfo,fileobj = None)
将TarInfo
对象tarinfo添加到存档。如果给出fileobj,它应该是一个二进制文件,并 tarinfo.size
从中读取字节并将其添加到存档中。您可以TarInfo
直接创建对象,也可以使用gettarinfo()
。
TarFile.gettarinfo
(name = None,arcname = None,fileobj = None)
根据现有文件TarInfo
的结果os.stat()
或等效项创建一个对象。该文件可以按名称命名,也可以用文件描述符 指定为文件对象 fileobj。 名称可能是一个类似于路径的对象。如果给定,arcname为档案中的文件指定替代名称,否则,该名称取自fileobj的 name
属性或名称参数。该名称应该是一个文本字符串。
您可以TarInfo
在添加它之前修改其中的一些属性addfile()
。如果文件对象不是位于文件开头的普通文件对象,则size
可能需要修改等属性。这是对象的情况,例如GzipFile
。的name
也可以被修饰,在这种情况下arcname 可能是一个虚设字符串。
改变在3.6版本:该名称参数接受路径状物体。
TarFile.close
()
关闭TarFile
。在写入模式下,两个完成零块被附加到存档。
TarFile.pax_headers
包含pax全局标题的键值对的字典。
TarInfo对象
一个TarInfo
对象表示a中的一个成员TarFile
。除了存储文件的所有必需属性(如文件类型,大小,时间,权限,所有者等)之外,它还提供了一些有用的方法来确定它的类型。它不包含该文件的数据本身。
TarInfo
对象由TarFile
方法 返回getmember()
,getmembers()
并且gettarinfo()
。
classtarfile.TarInfo
(name =“”)
创建一个TarInfo
对象。
classmethodTarInfo.frombuf
(buf,encoding,errors)
TarInfo
从字符串缓冲区buf创建并返回一个对象。
HeaderError
如果缓冲区无效则引发。
classmethodTarInfo.fromtarfile
(tarfile)
从TarFile
对象tarfile中读取下一个成员,并将其作为TarInfo
对象返回。
TarInfo.tobuf
(format = DEFAULT_FORMAT,encoding = ENCODING,errors ='surrogateescape')
从一个TarInfo
对象创建一个字符串缓冲区。有关参数的信息,请参阅TarFile
该类的构造函数。
在3.2版本中更改:使用'surrogateescape'
作为默认的错误说法。
一个TarInfo
对象具有以下公共数据属性:
TarInfo.name
档案成员的名称。
TarInfo.size
字节大小。
TarInfo.mtime
上次修改时间。
TarInfo.mode
权限位。
TarInfo.type
文件类型。 类型通常是这些常量之一:REGTYPE
, AREGTYPE
,LNKTYPE
,SYMTYPE
,DIRTYPE
,FIFOTYPE
,CONTTYPE
,CHRTYPE
,BLKTYPE
, GNUTYPE_SPARSE
。要TarInfo
更方便地确定对象的类型,请使用is*()
下面的方法。
TarInfo.linkname
目标文件名称的名称,它仅存TarInfo
在于类型LNKTYPE
和对象中SYMTYPE
。
TarInfo.uid
最初存储此成员的用户的用户标识。
TarInfo.gid
最初存储此成员的用户的组ID。
TarInfo.uname
用户名。
TarInfo.gname
团队名字。
TarInfo.pax_headers
包含关联的pax扩展标题的键值对的字典。
一个TarInfo
对象还提供了一些方便的查询方法:
TarInfo.isfile
()
如果Tarinfo
对象是常规文件,则返回True
。
TarInfo.isreg
()
和isfile()
一样。
TarInfo.isdir
()
如果它是目录,则返回。True
TarInfo.issym
()
如果它是符号链接,则返回True
。
TarInfo.islnk
()
如果它是一个硬链接,则返回True
。
TarInfo.ischr
()
如果它是一个字符设备,则返回True
。
TarInfo.isblk
()
如果它是块设备则返回True
。
TarInfo.isfifo
()
如果它是FIFO,则返回True
。
TarInfo.isdev
()
如果是字符设备,块设备或FIFO之一,则返回True
。
命令行界面
3.4版新增功能
该tarfile
模块提供了一个简单的命令行界面来与tar档案进行交互。
如果你想创建一个新的tar档案,在-c
选项后面指定它的名字,然后列出应该包含的文件名:
$ python -m tarfile -c monty.tar spam.txt eggs.txt
传递一个目录也是可以接受的:
$ python -m tarfile -c monty.tar life-of-brian_1979/
如果您想将tar归档文件解压缩到当前目录中,请使用以下-e
选项:
$ python -m tarfile -e monty.tar
您也可以通过传递目录名称将tar归档文件解压缩到其他目录中:
$ python -m tarfile -e monty.tar other-dir/
有关tar归档文件的列表,请使用以下-l
选项:
$ python -m tarfile -l monty.tar
命令行选项
-l<tarfile>--list<tarfile>
列出tarfile中的文件。
-c<tarfile> <source1> ... <sourceN>--create<tarfile> <source1> ... <sourceN>
从源文件创建tarfile。
-e<tarfile> [<output_dir>]--extract<tarfile> [<output_dir>]
如果未指定output_dir,则将tarfile解压缩到当前目录中。
-t<tarfile>--test<tarfile>
测试tarfile是否有效。
-v,--verbose
详细输出。
示例
如何提取整个tar档案到当前工作目录:
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()
如何TarFile.extractall()
使用生成器函数而不是列表提取tar存档的子集:
import os
import tarfile
def py_files(members):
for tarinfo in members:
if os.path.splitext(tarinfo.name)[1] == ".py":
yield tarinfo
tar = tarfile.open("sample.tar.gz")
tar.extractall(members=py_files(tar))
tar.close()
如何从文件名列表中创建一个未压缩的tar归档文件:
import tarfile
tar = tarfile.open("sample.tar", "w")
for name in ["foo", "bar", "quux"]:
tar.add(name)
tar.close()
使用with
声明的同一个例子:
import tarfile
with tarfile.open("sample.tar", "w") as tar:
for name in ["foo", "bar", "quux"]:
tar.add(name)
如何读取gzip压缩的tar档案并显示一些成员信息:
import tarfile
tar = tarfile.open("sample.tar.gz", "r:gz")
for tarinfo in tar:
print(tarinfo.name, "is", tarinfo.size, "bytes in size and is", end="")
if tarinfo.isreg():
print("a regular file.")
elif tarinfo.isdir():
print("a directory.")
else:
print("something else.")
tar.close()
如何使用以下过滤器 参数创建归档并重置用户信息TarFile.add()
:
import tarfile
def reset(tarinfo):
tarinfo.uid = tarinfo.gid = 0
tarinfo.uname = tarinfo.gname = "root"
return tarinfo
tar = tarfile.open("sample.tar.gz", "w:gz")
tar.add("foo", filter=reset)
tar.close()
支持的tar格式
有三种可以使用该tarfile
模块创建的tar格式:
- POSIX.1-1988 ustar格式(
USTAR_FORMAT
)。它支持的文件名长度最多为256个字符,链接名称最多为100个字符。最大文件大小为8千兆字节。这是一个古老而有限但广泛支持的格式。
- GNU tar格式(
GNU_FORMAT
)。它支持长文件名和链接名称,大于8千兆字节的文件和稀疏文件。它是GNU / Linux系统上的事实标准。tarfile
完全支持长名称的GNU tar扩展,稀疏文件支持是只读的。
- POSIX.1-2001 pax格式(
PAX_FORMAT
)。它是最灵活的格式,几乎没有限制。它支持长文件名和链接名称,大文件和便携式存储路径名。但是,今天并非所有的tar实现都能够正确处理pax归档。
在PAX格式的扩展现有的ustar格式。它使用额外的头部来存储不能以其他方式存储的信息。有两种类型的pax头文件:扩展头文件只影响后续文件头文件,全局头文件对整个存档文件有效并影响所有后续文件。出于便携性原因,pax标头中的所有数据都以UTF-8编码。
还有一些可以读取但不能创建的tar格式变体:
- 古代的V7格式。这是Unix第七版的第一个tar格式,只存储常规文件和目录。名称不能超过100个字符,没有用户/组名称信息。某些档案在包含非ASCII字符的字段中错误计算标题校验和。
- SunOS tar扩展格式。这种格式是POSIX.1-2001 pax格式的变体,但不兼容。
5. Unicode问题
tar格式最初被设想为在磁带驱动器上进行备份,主要侧重于保存文件系统信息。现在,tar档案通常用于文件分发和在网络上交换档案。原始格式(所有其他格式仅仅是变体)的一个问题是没有支持不同字符编码的概念。例如,如果包含非ASCII字符,则在Latin-1系统上无法正确读取在UTF-8系统上创建的普通tar归档文件。包含这些字符的名称(即文件名,链接名称,用户/组名称)将显示损坏。不幸的是,没有办法自动检测存档的编码。
pax格式旨在解决此问题。它使用通用字符编码UTF-8存储非ASCII名称。读取pax归档文件时,这些UTF-8名称将转换为本地文件系统的编码。
unicode转换的细节由类的编码和错误关键字参数控制TarFile
。
编码的默认值是本地字符编码。它是从sys.getfilesystemencoding()
和推导出来的sys.getdefaultencoding()
。在读取模式下,编码专门用于将来自pax归档的unicode名称转换为本地字符编码中的字符串。在写入模式下,使用编码取决于所选的存档格式。如果PAX_FORMAT
包含非ASCII字符的输入名称在被存储为UTF-8字符串之前需要解码。除非使用unicode对象作为输入名称,否则其他格式不使用编码。这些字符串在添加到存档之前会转换为8位字符串。
所述误差参数定义如何字符都被视为不能被转换,或从编码。可能的值在Codec Base Classes部分列出。在读取模式下,还有一个额外的方案'utf-8'
,这意味着错误的字符被UTF-8表示所替代。这是默认方案。在写入模式下,错误的默认值是'strict'
确保名称信息不被忽视。
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com