1. tarfile 简单介绍
Python 的 tarfile
模块提供了对 .tar
格式归档文件的全面支持,允许用户创建、读取、修改和写入 tar 归档文件。在实际应用中,tar 文件通常用于将多个文件或目录打包成一个单一的档案文件,便于存储、传输或者备份。此外,tar 文件还可以配合压缩工具(如 gzip, bzip2, 或 lzma)生成诸如 .tar.gz
, .tar.bz2
, 或 .tar.xz
等格式的压缩归档。
以下是一些 tarfile
模块的核心功能:
-
打开和创建归档:
- 使用
tarfile.open()
函数可以打开已存在的 tar 归档文件,也可以创建新的归档文件。模式参数(mode)决定了操作行为,比如'r'
用于只读、'w'
用于覆盖写入、'a'
用于追加以及'x'
用于独占创建等。
- 使用
-
添加文件到归档:
- 创建
TarFile
对象后,可以使用add()
方法将单个文件或整个目录结构添加到归档中。
- 创建
-
从归档中提取文件:
- 使用
extractall()
方法可以将归档中的所有文件解压到指定目录。 - 通过
extract()
方法可以单独提取归档内的某个成员文件。
- 使用
-
读取归档信息:
- 可以遍历
TarFile
对象获取每个成员(即归档中的文件)的信息,包括名称、大小、权限、时间戳等。 - 也可以通过
getmember()
方法查找并返回特定成员的信息。
- 可以遍历
-
支持压缩:
- 如上述模式参数所示,
tarfile.open()
函数可以直接处理压缩过的 tar 归档文件,并且支持多种压缩格式,如'r:gz'
表示读取gzip压缩的tar文件,'w:xz'
表示创建lzma压缩的tar文件等。
- 如上述模式参数所示,
-
其他高级功能:
- 支持自定义归档成员的属性(metadata)。
- 支持存档加密(尽管标准tarfile模块不直接提供加密功能,但可以通过与其他库结合实现)。
举例说明如何使用 tarfile
模块创建一个简单的tar归档:
import tarfile
# 创建一个新的tar归档文件(不压缩)
with tarfile.open("example.tar", mode="w") as tar:
# 将当前目录下的"file.txt"文件添加到归档
tar.add("file.txt")
# 打开一个已存在的gzip压缩过的tar归档文件进行读取
with tarfile.open("example.tar.gz", mode="r:gz") as tar:
# 提取归档中的所有文件到当前目录
tar.extractall()
2. tarfile 支持的模式
mode | action |
---|---|
'r' 或 'r:*' | Open for reading with transparent compression (recommended). 自动解压并打开文件–推荐模式 |
'r:' | Open for reading exclusively without compression. 只打开文件不解压 |
'r:gz' | Open for reading with gzip compression. 采用gzip格式解压并打开文件 |
'r:bz2' | Open for reading with bzip2 compression. 采用bz2格式解压并打开文件 |
'r:xz' | Open for reading with lzma compression. 采用lzma格式解压并打开文件 |
'x' 或 'x:' | Create a tarfile exclusively without compression. Raise an [FileExistsError]exception if it already exists. 仅创建打包文件,不压缩 |
'x:gz' | Create a tarfile with gzip compression. Raise an [FileExistsError]exception if it already exists. 采用gzip方式压缩并打包文件 |
'x:bz2' | Create a tarfile with bzip2 compression. Raise an [FileExistsError]exception if it already exists. 采用bzip2方式压缩并打包文件 |
'x:xz' | Create a tarfile with lzma compression. Raise an [FileExistsError]exception if it already exists. 采用lzma方式压缩并打包文件 |
'a' 或 'a:' | Open for appending with no compression. The file is created if it does not exist. 打开文件,并以不压缩的方式追加内容。如果文件不存在,则新建 |
'w' 或 'w:' | Open for uncompressed writing. 以不压缩的方式写入,即只归档不压缩 |
'w:gz' | Open for gzip compressed writing. 以gzip的方式压缩并写入 |
'w:bz2' | Open for bzip2 compressed writing. 以bzip2的方式压缩并写入 |
'w:xz' | Open for lzma compressed writing. 以lzma的方式压缩并写入 |
3. 绝对路径压缩
下面对 /User/xx/data/file.txt 进行压缩,这个是以绝对路径压缩的。
def compress(compress_file_path, ori_file_path):
with tarfile.open(compress_file_path, "w:gz") as tar:
tar.add(ori_file_path)
if __name__ == "__main__":
compress("~/dataset/outfile.tgz", "~/dataset/file.txt")
绝对路径压缩后,其解压后如下:
也就是说会保留你当时解压时的绝对路径!
4. 相对路径压缩
增加参数 arcname
,例如,下面对 /User/xx/data/file.txt
进行压缩,这个是以相对路径压缩的,即在任何地方解压后就直接可以得到这个文件file.txt
~
def compress(compress_file_path, ori_file_path):
with tarfile.open(compress_file_path, "w:gz") as tar:
tar.add(ori_file_path, arcname=os.path.basename(ori_file_path))
if __name__ == "__main__":
compress("/User/xx/data/outfile.tgz", "/User/xx/data/file.txt")
5. 参考
https://www.cnblogs.com/hls-code/p/16626565.html