Найти - Пользователи
Полная версия: Как выловить битый архив
Начало » Python для новичков » Как выловить битый архив
1
kt368
Здравствуйте!
Использую модуль subprocess, точнее его метод call для вызова через командную строку 7-zip архиватора с целью распаковки архивов в временную папочку, далее обрабатываю содержимое архива, содержимое временной папки удаляю, беру следующий архив, subprocess.call(…) и так по кругу (в цикле).
Возникла ситуация - один из архивов битый, в результате 7-zip выдал “Error: Can not open file as archive”, программа продолжила выполняться, и, ясное дело, вывалила ошибку, мол во временной папке нет данных. Как вы посоветуете отслеживать нормально ли распаковался архив, вернее не выдалось ли сообщение “Error: Can not open file as archive”? В каждом архиве по 2401 мелкому текстовому файлу. Очень важна производительность, поэтому не хотелось бы прибегать к предварительному тестированию каждого архива 7-zip'ом, просто…Что можно посоветовать?
Заранее спасибо.
py.user.next
для начала проверь, не возвращает ли 7-zip соответствующий код возврата
если тот есть, то его можно проверять

>>> ret = subprocess.call(['echo', 'x'])
x
>>> print(ret)
0
>>> ret = subprocess.call(['cat', 'x'])
cat: x: Нет такого файла или каталога
>>> print(ret)
1
>>>
JOHN_16
kt368
в дополнение к сказанному: наверняка 7-zip пишет сообщения в stderr, можно считывать его, в случае если коды возврата не предусмотрены или по другой причине.
doza_and
7z возвращает код ошибки
А в питоне естественно подойти так:
import subprocess as sp
try:
	sp.check_call("7z x tmp.7z")
	print "done ок"
except:
	print "fail"
        raise

7-Zip 9.20 Copyright © 1999-2010 Igor Pavlov 2010-11-18

Processing archive: tmp.7z

Error: Can not open file as archive

Traceback (most recent call last):
File “C:\PROJECTS\mc2web\777\a.py”, line 3, in <module>
sp.check_call(“7z x tmp.7z”)
File “C:\comp\Python27\lib\subprocess.py”, line 511, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command ‘7z x tmp.7z’ returned non-zero exit status 2

сразу видно код ошибки 2
kt368
Все получилось! Проверяю код возврата и если он не равен нулю - архив битый. Спасибо!
krishnarama
Если почитать документацию на прогу, то там будут описаны коды ошибки.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB