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

标签 python zip archive

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

os.path.isdir 和 os.path.isfile 不起作用,因为我正在处理存档。存档可以是 tar、bz2、zip 或 tar.gz 中的任何一个(所以我不能使用他们特定的库)。另外,代码应该可以在任何平台上运行,比如 linux 或 windows。有人可以帮我怎么做吗?

最佳答案

您已声明需要支持“tar、bz2、zip 或 tar.gz”。 Python的tarfile模块将自动处理 gz 和 bz2 压缩的 tar 文件,因此您实际上只需要支持 2 种类型的存档: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

The output is:

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

Notice that x/4 is "unknown" because it is a symbolic link.

There is no easy way, with zipfile, to distinguish a symlink (or other file types) from a directory or normal file. The information is there in the ZipInfo.external_attr attribute, but it's messy to get it back out:

import stat

linked_file = f.filelist[1]
is_symlink = stat.S_ISLNK(linked_file.external_attr >> 16L)

关于python - 如何检查它是否是python中存档的文件或文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35690072/

相关文章:

Java : Read a file with special characters from a Zip file

c# - 在 C# 中使用 winrar.exe 提取存档并检测是否发生任何错误

mysql - 如何使用 Mysql 过程和 Date() 创建存档表

mysql - 如何在 pt-archiver 中禁用 binlog

python - 使用 PyAudio 作为振荡器删除/控制点击声音

python - 将单例矩阵的 Pandas 数据框转换为数字数据框

java - Zip 文件是使用 Windows 路径分隔符创建的

Python:将字符串拆分为单词,保存分隔符

Python 'list' 对象不可调用

node.js - 如何使用nodejs的unzip2获取zip文件的条目列表