从python脚本测试7-Zip档案

时间:2015-09-24 04:26:57

标签: python archive 7zip

所以我有一个python脚本,在它的核心部分,为了备份数据而生成.7z所选目录的档案。为了简单起见,我只是通过windows命令行调用7-zip,如下所示:

def runcompressor(target, contents):
print("Compressing {}...".format(contents))
archive = currentmodule
archive += "{}\\{}.7z".format(target, target)
os.system('7z u "{}" "{}" -mx=9 -mmt=on -ssw -up1q0r2x2y2z1w2'.format(archive, contents))
print("Done!")

如果存在新存档,则创建新存档,如果存在则更新旧存档,但如果出现问题则存档将损坏,如果此命令遇到现有的,损坏的存档,则只会给出起来。现在7zip有一个测试存档完整性的命令,但是文档没有说明输出,然后就是在python中捕获输出的麻烦。

我是否可以先测试档案,以确定档案是否已损坏?

1 个答案:

答案 0 :(得分:1)

7z可执行文件遇到问题时返回值为2或更大的值。在批处理脚本中,通常使用errorlevel来检测此问题。不幸的是,Windows下的os.system()给出了用于运行程序的命令解释器的返回值,而不是程序本身的退出值。

如果你想要后者,你可能不得不使用subprocess模块让你的手更脏一点,而不是使用os.system()电话。

如果你有3.5(或更高版本),这很简单:

import subprocess as sp
x = sp.run(['7z', 'a', 'junk.7z', 'junk.txt'], stdout=sp.PIPE, stderr=sp.STDOUT)
print(x.returncode)

在我的情况下,junk.txt是一个真实的文件,但junk.7z只是我的一个文本文件的副本,因此是一个无效的存档。该程序的输出为2,因此如果出现问题,很容易检测到。

如果您打印x而非x.returncode,则会看到类似的内容(已重新格式化并删除\r\n个序列以提高可读性):

CompletedProcess(
  args=['7z', 'a', 'junk.7z', 'junk.txt'],
  returncode=2,
  stdout=b'
    7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
    Error: junk.7z is not supported archive
    System error:
    Incorrect function.
  '
)