is_tarfile()为空文件返回True

时间:2010-06-17 01:40:38

标签: python

编辑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)的{​​{3}}我认为这是不必要的:

  

如果name是tar存档,则返回True   文件,tarfile模块可以   读取。

我甚至检查了源代码documentation,我可以看到它正在检查标题块,但我不完全理解它是如何评估这些块的。

我是否误读了文档,因此设定了不公平的期望?

谢谢你,
扎卡里

4 个答案:

答案 0 :(得分:4)

空的tar文件 是一个完全有效且空的tar文件。在任何Unix shell提示符下考虑:

$ 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 :(得分:1)

在命令行中尝试此操作:

$ touch emptyfile
$ tar -tvf emptyfile

没有错误。

看起来空文件只是一个有效(但无用的)TAR文件。

答案 2 :(得分:1)

事实上,“is_tarfile”的行为似乎在Python 2.6和2.7之间发生了变化。在Python 2.7中,is_tarfile为空文件返回False

$ 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
>>> 
$ 

答案 3 :(得分:-1)

这是逻辑的基本特征。

默认假设为“True”,直到文件内容证明为假。

没有内容,也没有反对的假设。