如何检查它是否是python中存档的文件或文件夹?

Sam*_*Sam 5 python zip archive

我有一个我不想提取的存档,但检查它的每个内容是文件还是目录.

os.path.isdir和os.path.isfile不起作用,因为我正在处理归档.存档可以是tar,bz2,zip或tar.gz中的任何一个(因此我不能使用他们的特定库).此外,代码应该适用于任何平台,如Linux或Windows.任何人都可以帮我怎么做?

mha*_*wke 7

您已声明需要支持"tar,bz2,zip或tar.gz".Python的tarfile模块将自动处理gz和bz2压缩的tar文件,因此实际上只需要支持两种类型的存档:tar和zip.(bz2本身不是归档格式,它只是压缩).

您可以确定给定文件是否为tar文件tarfile.is_tarfile().这也适用于使用gzip或bzip2压缩压缩的tar文件.在tar文件中,您可以确定文件是使用目录TarInfo.isdir()还是使用文件TarInfo.isfile().

同样,您可以确定文件是否是使用的zip文件zipfile.is_zipfile().与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))
Run Code Online (Sandbox Code Playgroud)

在具有此结构的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)
Run Code Online (Sandbox Code Playgroud)


Sam*_*Sam 0

我得到了答案。就是我们可以使用两个命令:archive.getall_members()和archive.getfile_members()。

我们迭代它们中的每一个并将文件/文件夹名称存储在两个数组 a1(包含文件/文件夹名称)和 a2(仅包含文件名称)中。如果两个数组都包含该元素,则它是一个文件,否则它是一个文件夹。