is_tarfile() 对空文件返回 True
编辑 1
嗯,我接受大家说的tar可以处理空文件……但是在我的系统上:
$ touch emptytar
$ tar -tf emptytar
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors
难道我用的版本不标准吗?
$ tar --version
tar (GNU tar) 1.22
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by John Gilmore and Jay Fenlason.
大家好,
我正在测试一些逻辑,用来处理用户上传的TAR文件。当我给tarfile.is_tarfile()
一个空文件时,它返回True
,这让我有点意外:
$ touch tartest
$ cat tartest
$ python -c "import tarfile; print tarfile.is_tarfile('tartest')"
True
如果我在文件里加一些文字,它就返回False
,这个结果我就能接受:
$ echo "not a tar" > tartest
$ python -c "import tarfile; print tarfile.is_tarfile('tartest')"
False
我可以在开始时加个检查,看看文件长度是否为零,但根据文档里对tarfile.is_tarfile(name)
的描述,我觉得这其实没必要:
如果名字是一个tar归档文件,并且tarfile模块可以读取它,就返回True。
我甚至查看了源代码,tarfile.py,我看到它在检查头部块,但我不太明白它是怎么评估这些块的。
我是不是误解了文档,从而对结果有了不合理的期待?
谢谢,
扎卡里
4 个回答
1
实际上,"is_tarfile"这个功能在Python 2.6和2.7之间的表现似乎发生了变化。在Python 2.7中,is_tarfile
对于一个空文件会返回False
,也就是说它会告诉你这个空文件不是一个tar文件。
$ touch /tmp/foo.tar
$ python
Python 2.7.3 (default, Jul 24 2012, 11:41:40)
[GCC 4.6.3 20120306 (Red Hat 4.6.3-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tarfile
>>> print tarfile.is_tarfile("/tmp/foo.tar")
False
>>>
$
4
一个空的 tar 文件是一个完全有效的空 tar 文件。在任何 Unix 命令行提示符下,你可以这样看:
$ touch foo.tar
$ ls -l foo.tar
-rw-r--r-- 1 aleax staff 0 Jun 16 18:49 foo.tar
$ tar tvf foo.tar
$ tar xvf foo.tar
看到了吗?这个空的 foo.tar
对于 Unix 的 tar
命令来说是一个完全有效的 tar 文件——它只是没有任何内容可以显示或解压。如果 Python 处理 tar 文件的方式和 tar
自身差别这么大,那就真是个大问题了!文档中的哪一句话让你觉得这种令人头疼的不兼容是规范的一部分呢?
1
在命令行试试这个:
$ touch emptyfile
$ tar -tvf emptyfile
没有错误。
看起来一个空文件其实是一个有效的(但没什么用的)TAR文件。