tarfile

tarfile - 读写tar档案文件

2.3版本的新功能。

源代码: Lib / tarfile.py

tarfile模块可以读写tar档案,包括使用gzip或bz2压缩的档案。使用该zipfile模块读取或写入.zip文件,或shutil中的更高级别的函数。

一些事实和数字:

  • 如果各个模块可用,则读取和写入gzipbz2压缩归档。

  • 读/写支持POSIX.1-1988(ustar)格式。

  • 对GNU tar格式的读/写支持,包括长名称和长链接扩展,对稀疏扩展的只读支持。

  • 读/写支持POSIX.1-2001(pax)格式。

2.6版本中的新功能。

  • 处理目录,常规文件,硬链接,符号链接,fifo,字符设备和块设备,并能够获取和恢复文件信息,如时间戳,访问权限和所有者。

  • 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'确保名称信息不被忽视。