不幸的是,您无法从 zipfile 模块获取每个单独文件的压缩进度,但您可以通过跟踪到目前为止已处理的字节数来了解总进度。
正如 Mikko Ohtamaa 所建议的,最简单的方法是遍历文件列表两次,第一次确定文件大小,第二次进行压缩。然而,正如凯文提到的,目录的内容可能会在这两次传递之间发生变化,因此数字可能不准确。
下面的程序(为 Python 2.6 编写)说明了该过程。
#!/usr/bin/env python
''' zip all the files in dirname into archive zipname
Use only the last path component in dirname as the
archive directory name for all files
Written by PM 2Ring 2015.02.15
From http://stackoverflow.com/q/28522669/4014959
'''
import sys
import os
import zipfile
def zipdir(zipname, dirname):
#Get total data size in bytes so we can report on progress
total = 0
for root, dirs, files in os.walk(dirname):
for fname in files:
path = os.path.join(root, fname)
total += os.path.getsize(path)
#Get the archive directory name
basename = os.path.basename(dirname)
z = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED)
#Current data byte count
current = 0
for root, dirs, files in os.walk(dirname):
for fname in files:
path = os.path.join(root, fname)
arcname = os.path.join(basename, fname)
percent = 100 * current / total
print '%3d%% %s' % (percent, path)
z.write(path, arcname)
current += os.path.getsize(path)
z.close()
def main():
if len(sys.argv) < 3:
print 'Usage: %s zipname dirname' % sys.argv[0]
exit(1)
zipname = sys.argv[1]
dirname = sys.argv[2]
zipdir(zipname, dirname)
if __name__ == '__main__':
main()
请注意,我使用以下命令打开 zip 文件zipfile.ZIP_DEFLATED
压缩参数;默认是zipfile.ZIP_STORED
,即不执行压缩。此外,zip 文件可以处理 DOS 风格和 Unix 风格的路径分隔符,因此您不需要在存档路径名中使用反斜杠,正如我的代码所示,您可以使用os.path.join()
构造存档路径名。
顺便说一句,在你的代码中你有str(pic)
在你的内心深处for
环形。一般来说,在循环内重新评估具有常量参数的函数有点浪费。但在这种情况下,这是完全多余的,因为从你的第一个声明来看,pic
已经是一个字符串了。