Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 25, 2013 23:20:02

kt368
От:
Зарегистрирован: 2012-01-08
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Как выловить битый архив

Здравствуйте!
Использую модуль 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'ом, просто…Что можно посоветовать?
Заранее спасибо.



Офлайн

#2 Фев. 26, 2013 01:05:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Как выловить битый архив

для начала проверь, не возвращает ли 7-zip соответствующий код возврата
если тот есть, то его можно проверять

>>> ret = subprocess.call(['echo', 'x'])
x
>>> print(ret)
0
>>> ret = subprocess.call(['cat', 'x'])
cat: x: Нет такого файла или каталога
>>> print(ret)
1
>>>



Отредактировано py.user.next (Фев. 26, 2013 01:06:26)

Офлайн

#3 Фев. 26, 2013 01:34:07

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Как выловить битый архив

kt368
в дополнение к сказанному: наверняка 7-zip пишет сообщения в stderr, можно считывать его, в случае если коды возврата не предусмотрены или по другой причине.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Фев. 26, 2013 19:46:36

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Как выловить битый архив

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



Отредактировано doza_and (Фев. 26, 2013 19:51:35)

Офлайн

#5 Фев. 27, 2013 15:45:37

kt368
От:
Зарегистрирован: 2012-01-08
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Как выловить битый архив

Все получилось! Проверяю код возврата и если он не равен нулю - архив битый. Спасибо!



Офлайн

#6 Фев. 27, 2013 17:04:01

krishnarama
Зарегистрирован: 2013-02-27
Сообщения: 51
Репутация: +  -36  -
Профиль   Отправить e-mail  

Как выловить битый архив

Если почитать документацию на прогу, то там будут описаны коды ошибки.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version