2016-01-08 3 views
2

У меня есть тарболл, что я не могу открыть с помощью питона:питон tarfile.py «файл не может быть открыт успешно»

>>> import tarfile 
>>> tarfile.open('/tmp/bad.tar.gz') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "tarfile.py", line 1672, in open 
    raise ReadError("file could not be opened successfully") 
tarfile.ReadError: file could not be opened successfully 

, но я в состоянии извлечь файл без проблем по команде линия.

$ tar -xzvf /tmp/bad.tar.gz 

Я проследил питона tarfile кода, и есть функция «nti», где они преобразующие байт. Он получает по этой линии:

obj.uid = nti(buf[108:116]) 

и взрывается. Эти биты (для UID) проходят через восемь пробелов. Не знаете, куда идти отсюда ...

ответ

1

Честно говоря это выглядит как ошибка в tarfile.py «s nti функции:

n = int(nts(s) or "0", 8) 

Падение сквозной логики (or "0") не работает, потому что s это пространства , не None, поэтому int() взорван.

Я скопировал tarfile.py из /var/lib/python2.7/ и завернутых этой конкретной линии с TRY/уловом, которое фиксировало меня:

try: 
     obj.uid = nti(buf[108:116]) 
    except InvalidHeaderError: 
     obj.uid = 0 

Это обходное решение, хотя. На самом деле я бы предпочел, чтобы питон фолк взглянули на него и исправили "or "0" логики.

Update

Оказывается тарбалл был создан в проекте Java 6 maven-assembly-plugin, который только что был повышен до Java 7. проблема была решена путем модернизации maven-assembly-plugin2.5.3 к.

+0

Так архивный файл был поврежден? Имея не-числа в смещениях 108 до 116 дисквалифицирует его от дегтя файл. –

+0

@EugeneK * пожав плечами * Если мы меняем определение «коррумпированного» на «делает ли« tar »открытым файл?», тогда нет, он не был поврежден. :-) – inanutshellus

+0

@EugeneK Я полностью с вами, хотя с точки зрения того, что python, скорее всего, следует за спецификацией, и этот файл не вел себя правильно. С другой стороны ... если у вас нет битов UID и GID? должно ли это означать, что питон должен * фатально * урод? Похоже на чрезмерную реакцию. – inanutshellus

Смежные вопросы