我无法弄清楚如何使用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并且我一直得到奇怪的结果。
答案 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')
希望它有所帮助..我也有一篇关于它的博客文章
答案 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)