你已经说明你需要支持 "tar, bz2, zip 或 tar.gz"。Python的 tarfile
模块会自动处理gz和bz2压缩的tar文件,因此实际上只需要支持两种压缩格式:tar 和 zip。(bz2本身不是一种压缩格式,它只是一种压缩方式)。
你可以使用 tarfile.is_tarfile()
来确定给定的文件是否为tar文件。这也适用于使用gzip或bzip2压缩的tar文件。在tar文件内,你可以使用 TarInfo.isdir()
来判断一个文件是否是目录,使用 TarInfo.isfile()
来判断一个文件是否是普通文件。
同样地,你可以使用 zipfile.is_zipfile()
来确定一个文件是否是zip文件。在 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是目录
x/4为未知类型
x/3是目录
x/3/4是目录
x/3/4/zzz是文件
x/2是目录
x/2/aa是文件
x/1是目录
x/1/abc是文件
x/1/ab是文件
x/1/a是文件
注意,
x/4
是“未知”的,因为它是符号链接。
使用
zipfile
没有简单的方法来区分符号链接(或其他文件类型)与目录或普通文件。这些信息可以在
ZipInfo.external_attr
属性中找到,但是要将其取回很麻烦:
import stat
linked_file = f.filelist[1]
is_symlink = stat.S_ISLNK(linked_file.external_attr >> 16L)