Python tarfile模块

时间:2020-02-23 14:43:35  来源:igfitidea点击:

Python tarfile模块用于读取和写入tar归档文件。
Python为我们提供了出色的工具和模块来管理压缩文件,其中包括(但不限于)使用gzip,bz2和lzma压缩等不同机制执行文件和目录压缩。

在本文中,我们将看到Python tarfile模块功能的各种实际演示。
这类似于python zip函数。

Python tarfile模块

Python tarfile模块为我们提供了执行各种操作的功能,例如:

  • 读写gzip,bz2和lzma档案
  • 读写POSIX.1-1988(ustar)格式
  • 对GNU tar格式的读写支持
  • 读写gzip,bz2和lzma档案

除了这些功能,我们还可以处理目录并还原文件信息,例如时间戳,访问权限和所有者。

检查TAR文件的有效性

我们将从一个最简单的示例开始,检查文件是否为有效的TAR文件。
我们将使用is_tarfile()函数执行此操作:

import tarfile

for file_name in [ 'README.txt', 'example.tar.gz' ]:
  try:
      print(file_name, tarfile.is_tarfile(filename))
  except (IOError, err):
      print(file_name, err)

让我们运行此示例并检查输出:请注意,这些文件应该存在于运行此脚本的目录中。

读取TAR文件元数据

在本节中,我们将使用open()getnames()函数研究与TAR文件相关的元数据,例如文件包含哪些文件:

import tarfile

t = tarfile.open('example.tar.gz', 'r')
print("Files in TAR file:")
print(t.getnames())

让我们运行此示例并检查输出:请注意,我们只是将示例文件放在此TAR中进行演示。

在继续下一个示例之前,让我们深入了解文件的元数据。
我们将打印其大小以及与之相关的更多信息:

import tarfile
import time

t = tarfile.open('example.tar.gz', 'r')
for info in t.getmembers():
  print(info.name)
  print('Modified:', time.ctime(info.mtime))
  print('Mode    :', oct(info.mode))
  print('Type    :', info.type)
  print('Size    :', info.size, 'bytes')

当我们运行该程序时,我们可以看到更多与文件有关的信息:

从档案中提取文件

其中我们将从存档文件中提取文件:

import tarfile

t = tarfile.open('example.tar.gz', 'r')
for file_name in [ 'TarFolder/README.txt', 'TarFolder/tarfile_validity.py' ]:
  try:
      f = t.extractfile(file_name)
  except KeyError:
      print('ERROR: Did not find %s in tar archive' % file_name)
  else:
      print(file_name, ':', f.readlines())

将文件添加到存档

其中我们将文件添加到存档文件中:

import tarfile

print('creating archive')
out = tarfile.open('example.tar.gz', mode='w')
try:
  print('adding README.txt')
  out.add('README.txt')
finally:
  print('closing tar archive')
  out.close()

print('Contents of archived file:')
t = tarfile.open('example.tar.gz', 'r')
for member in t.getmembers():
  print(member.name)

让我们运行此示例并检查输出:其中值得注意的是," w"不会保留文件的先前内容。
相反,我们可以使用" a"模式将文件追加到存档中。

将文件追加到存档

其中我们将文件追加到存档文件中,而不是使用" w"模式:

import tarfile

print('creating archive')
out = tarfile.open('example.tar.gz', mode='a')
try:
  print('adding README.txt')
  out.add('README.txt')
finally:
  print('closing tar archive')
  out.close()

print('Contents of archived file:')
t = tarfile.open('example.tar.gz', 'r')
for member in t.getmembers():
  print(member.name)