编辑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,我可以看到它正在检查标题块,但我不完全理解它是如何评估这些块的。
我是否误读了文档,因此设定了不公平的期望?
谢谢你,
扎卡里
答案 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”,直到文件内容证明为假。
没有内容,也没有反对的假设。