在Python中压缩文件的更好方法(使用单个命令压缩整个目录)?

时间:2010-08-31 18:36:52

标签: python zip

  

可能重复:
  How do I zip the contents of a folder using python (version 2.5)?

假设我有一个目录:/home/user/files/。这个目录有一堆文件:

/home/user/files/
  -- test.py
  -- config.py

我想在python中使用ZipFile压缩此目录。我是否需要loop through the directory and add these files recursively,或者是否可以传递目录名称,ZipFile类会自动添加其下的所有内容?

最后,我想:

/home/user/files.zip (and inside my zip, I dont need to have a /files folder inside the zip:)
  -- test.py
  -- config.py

4 个答案:

答案 0 :(得分:23)

请注意,这不包括空目录。如果需要,可以在网上找到解决方法;可能最好在我们最喜欢的归档程序中获取空目录的ZipInfo记录,以查看它们中的内容。

硬编码文件/路径以摆脱我的代码细节...

target_dir = '/tmp/zip_me_up'
zip = zipfile.ZipFile('/tmp/example.zip', 'w', zipfile.ZIP_DEFLATED)
rootlen = len(target_dir) + 1
for base, dirs, files in os.walk(target_dir):
   for file in files:
      fn = os.path.join(base, file)
      zip.write(fn, fn[rootlen:])

答案 1 :(得分:6)

您可以尝试使用distutils包:

distutils.archive_util.make_zipfile(base_name, base_dir[, verbose=0, dry_run=0])

答案 2 :(得分:2)

您也可以通过调用zip

来使用Unix shell中提供的os.system命令。

答案 3 :(得分:1)

您可以使用subprocess模块:

import subprocess

PIPE = subprocess.PIPE
pd = subprocess.Popen(['/usr/bin/zip', '-r', 'files', 'files'],
                      stdout=PIPE, stderr=PIPE)
stdout, stderr = pd.communicate()

代码未经过测试,假装只能在unix机器上运行,我不知道windows是否有类似的命令行实用程序。