我有一个存档,我不想提取它,但检查它的每个内容是文件还是目录。
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/