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

8 投票
4 回答
22153 浏览
提问于 2025-04-16 03:32

可能重复的问题:
我该如何用Python(版本2.5)压缩一个文件夹的内容?

假设我有一个文件夹:/home/user/files/。这个文件夹里有很多文件:

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

我想用Python中的ZipFile来压缩这个文件夹。我需要逐个遍历这个文件夹,把这些文件一个个加进去吗,还是说可以直接传入文件夹的名字,让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 个回答

7

你可以试试使用distutils这个包:

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

请注意,这里不包括空文件夹。如果需要空文件夹的话,网上有一些解决办法;最好还是查看我们喜欢的压缩软件中的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

你可以使用 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是否有类似的命令行工具。

撰写回答