2010-06-17 6 views
7

EDIT 1is_tarfile() Devuelve verdadero para un archivo en blanco

Hmm, acepto las respuestas que el alquitrán respeta un archivo vacío ... pero en mi sistema:

$ touch emptytar 
$ tar -tf emptytar 
tar: This does not look like a tar archive 
tar: Exiting with failure status due to previous errors 

Tal vez tengo una versión no canónica?

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

Hola a todos,

estoy probando algo de lógica para manejar un usuario cargar un archivo TAR. Cuando doy de comer a un archivo en blanco a tarfile.is_tarfile() vuelve True, que no es lo que estoy esperando:

$ touch tartest 
$ cat tartest 
$ python -c "import tarfile; print tarfile.is_tarfile('tartest')" 
True 

Si añado un poco de texto en el archivo, devuelve False, que estoy esperando:

$ echo "not a tar" > tartest 
$ python -c "import tarfile; print tarfile.is_tarfile('tartest')" 
False 

que podría añadir un cheque al principio para comprobar si hay un archivo de longitud cero, pero en base a la documentation para tarfile.is_tarfile(name) creo que esto es innecesario:

Devuelve True si el nombre es un archivo tar , que el módulo tarfile puede leer.

me fue tan lejos como para comprobar la fuente, tarfile.py, y puedo ver que se está comprobando bloques de cabecera, pero no entiendo cómo se ha puesto evaluando esos bloques.

¿Estoy malinterpretando la documentación y, por lo tanto, estableciendo expectativas injustas?

Gracias,
Zachary

+1

El 'tar' con el que he intentado es GNU's 1.15.1 (como portado por Apple a MacOSX/Darwin); ¡No puedo explicar tu observación de que 1.22 parece haber cambiado de una manera incompatible hacia atrás! –

+0

Puedo confirmar el comportamiento de error de GNU tar 1.26 en un archivo vacío: arroja un error, mientras que tarfile.is_tarfile devuelve True – m13r

Respuesta

1

intenta esto en la línea de comandos:

$ touch emptyfile 
$ tar -tvf emptyfile 

No hay errores.

Parece que un archivo vacío simplemente es un archivo TAR válido (pero inútil).

+0

esto al menos no funciona con tar versión 1.22 y 1.26 – m13r

-1

Ésta es una característica fundamental de la lógica.

La suposición predeterminada es "Verdadero" hasta que el contenido del archivo demuestre que es falso.

Sin contenido, no rehúsa la suposición.

+0

Entonces, ¿por qué python's zipfile.is_zipfile (emptyfile) devuelve False? – m13r

4

Un archivo tar vacío es un archivo tar perfectamente válido y vacío. Considere, en cualquier prompt de shell de 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 

See? El foo.tar vacío es un archivo tar perfectamente válido para el comando Unix tar; simplemente no tiene nada que mostrar ni desempaquetar. ¡Sería realmente problemático si el manejo del alquitrán de Python difería tan drásticamente del de tar mismo! ¿Qué oración en los documentos te llevó a creer que una incompatibilidad problemática e inductora de dolor de cabeza es parte de las especificaciones?

1

De hecho, el comportamiento de "is_tarfile" parece haber cambiado entre Python 2.6 y 2.7. En Python 2.7, is_tarfile devuelve False para un archivo vacío.

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

Lo aprendí de la manera difícil ... –

+0

¡Esta es la respuesta que estaba buscando! – m13r

Cuestiones relacionadas