Python:如何使用shutil.make_archive?

时间:2017-07-21 19:07:13

标签: python zip shutil

我无法弄清楚如何使用shutil.make_archive将文件夹压缩成zip文件,然后将该saved_20170721.zip文件放入名为past_data

的文件夹中

我有代码:

from shutil   import make_archive
from datetime import datetime

folderpath_to_zip_up = 'c:\my_work\todays_data'                    # I wanna zip up this folder
folderpath_archive   = 'c:\past_data'                              # And put it into here as file
filename             = 'saved_{:%Y-%m-%d}'.format(datetime.now())    

make_archive(filename, 'zip', folderpath_archive, folderpath_to_zip_up)

我的目标是'c:\past_data'看起来像:

past_data---+ saved_20170721.zip
            + saved_20170722.zip
            + saved_20170723.zip
            + saved_20170724.zip

但是我无法理解documentation并且我一直得到奇怪的结果。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,发现shutil.make_archive的文档非常密集且反直觉。

我最终得到它并写了一个函数来帮助我,因为我第一次做不到它。

import os, shutil
def make_archive(source, destination):
        base = os.path.basename(destination)
        name = base.split('.')[0]
        format = base.split('.')[1]
        archive_from = os.path.dirname(source)
        archive_to = os.path.basename(source.strip(os.sep))
        shutil.make_archive(name, format, archive_from, archive_to)
        shutil.move('%s.%s'%(name,format), destination)

make_archive('/path/to/folder', '/path/to/folder.zip')

希望它有所帮助..我也有一篇关于它的博客文章

http://www.seanbehan.com/how-to-use-python-shutil-make_archive-to-zip-up-a-directory-recursively-including-the-root-folder/

答案 1 :(得分:0)

文档的措辞没有帮助。如果我们从用法 shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])

  • base_name 是要创建存档的路径,包括文件名,但不包括扩展名
  • format,正如您所发现的,是您要创建的存档类型

您可能已经注意到,其他所有内容都是可选的。仅使用这两个参数,该函数将创建当前工作目录的存档。那不是你想要的,所以让我们看看接下来的两个参数:

  • root_dir 是您要从中创建存档的目录
  • base_dir 是一种过滤 root_dir 内容的方法。如果您设置 base_dir,您的存档将包含 base_dir 的父目录,一直到 root_dir,但这些父目录的所有其他内容将不存在。 只有 base_dir 及其子项会包含它们的所有内容。

由于您只是想按原样归档您的目录,因此您不需要 base_dir。所以我只想修改你原来的电话:

import os
#...
make_archive(os.path.join(folderpath_archive, filename), 'zip', folderpath_to_zip_up)