您已经声明需要支持“tar、bz2、zip 或 tar.gz”。蟒蛇的tarfile
模块将自动处理 gz 和 bz2 压缩的 tar 文件,因此实际上只需要支持 2 种类型的存档:tar 和 zip。 (bz2 本身不是存档格式,它只是压缩)。
您可以使用以下命令确定给定文件是否为 tar 文件tarfile.is_tarfile()
。这也适用于使用 gzip 或 bzip2 压缩的 tar 文件。在 tar 文件中,您可以使用以下命令确定文件是否是目录TarInfo.isdir()
或一个文件TarInfo.isfile()
.
同样,您可以使用以下命令确定文件是否是 zip 文件zipfile.is_zipfile()
. With zipfile
没有方法区分目录和普通文件,但以以下结尾的文件/
是目录。
因此,给定文件名,您可以执行以下操作:
import zipfile
import tarfile
filename = 'test.tgz'
if tarfile.is_tarfile(filename):
f = tarfile.open(filename)
for info in f:
if info.isdir():
file_type = 'directory'
elif info.isfile():
file_type = 'file'
else:
file_type = 'unknown'
print('{} is a {}'.format(info.name, file_type))
elif zipfile.is_zipfile(filename):
f = zipfile.ZipFile(filename)
for name in f.namelist():
print('{} is a {}'.format(name, 'directory' if name.endswith('/') else 'file'))
else:
print('{} is not an accepted archive file'.format(filename))
当在具有以下结构的 tar 文件上运行时:
(py2)[mhawke@localhost tmp]$ tar tvfz /tmp/test.tgz
drwxrwxr-x mhawke/mhawke 0 2016-02-29 12:38 x/
lrwxrwxrwx mhawke/mhawke 0 2016-02-29 12:38 x/4 -> 3
drwxrwxr-x mhawke/mhawke 0 2016-02-28 21:14 x/3/
drwxrwxr-x mhawke/mhawke 0 2016-02-28 21:14 x/3/4/
-rw-rw-r-- mhawke/mhawke 0 2016-02-28 21:14 x/3/4/zzz
drwxrwxr-x mhawke/mhawke 0 2016-02-28 21:13 x/2/
-rw-rw-r-- mhawke/mhawke 0 2016-02-28 21:13 x/2/aa
drwxrwxr-x mhawke/mhawke 0 2016-02-28 21:13 x/1/
-rw-rw-r-- mhawke/mhawke 0 2016-02-28 21:13 x/1/abc
-rw-rw-r-- mhawke/mhawke 0 2016-02-28 21:13 x/1/ab
-rw-rw-r-- mhawke/mhawke 0 2016-02-28 21:13 x/1/a
输出是:
x is a directory
x/4 is a unknown
x/3 is a directory
x/3/4 is a directory
x/3/4/zzz is a file
x/2 is a directory
x/2/aa is a file
x/1 is a directory
x/1/abc is a file
x/1/ab is a file
x/1/a is a file
请注意x/4
是“未知”,因为它是符号链接。
没有简单的方法,zipfile
,以区分符号链接(或其他文件类型)与目录或普通文件。该信息位于ZipInfo.external_attr
属性,但是将其恢复出来很混乱:
import stat
linked_file = f.filelist[1]
is_symlink = stat.S_ISLNK(linked_file.external_attr >> 16L)