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

发布于 2024-09-16 13:45:18 字数 712 浏览 9 评论 0原文

可能的重复:
如何压缩使用 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

Possible Duplicate:
How do I zip the contents of a folder using python (version 2.5)?

Suppose I have a directory: /home/user/files/. This dir has a bunch of files:

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

I want to zip this directory using ZipFile in python. Do I need to loop through the directory and add these files recursively, or is it possible do pass the directory name and the ZipFile class automatically adds everything beneath it?

In the end, I would like to have:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

你没皮卡萌 2024-09-23 13:45:18

请注意,这不包括空目录。如果需要这些,可以在网上找到解决方法;也许最好在我们最喜欢的归档程序中获取空目录的 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:])

Note that this doesn't include empty directories. If those are required there are workarounds available on the web; probably best to get the ZipInfo record for empty directories in our favorite archiving programs to see what's in them.

Hardcoding file/path to get rid of specifics of my code...

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:])
嘿看小鸭子会跑 2024-09-23 13:45:18

您可以尝试使用 distutils 包:

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

You could try using the distutils package:

distutils.archive_util.make_zipfile(base_name, base_dir[, verbose=0, dry_run=0])
菩提树下叶撕阳。 2024-09-23 13:45:18

您也许还可以使用 zip 命令可在 Unix shell 中调用 os.system

You might also be able to get away with using the zip command available in the Unix shell with a call to os.system

╭ゆ眷念 2024-09-23 13:45:18

您可以使用 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 是否有类似的命令行实用程序。

You could use subprocess module:

import subprocess

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

The code is not tested and pretends to works just on unix machines, i don't know if windows has similar command line utilities.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文