如何在Python中压缩文件夹及其所有文件,同时保留其内容的文件夹名称和相对路径?

时间:2017-11-22 02:17:26

标签: python python-3.x zip shutil

我正在尝试在Python 3.5中创建一个备份脚本,它将压缩指定文件夹的所有内容。这就是我现在正在做的事情:

import shutil
import datetime
import os
import os.path

import dropbox


INPUT_FOLDER = '~/Documents/db-backup-test/'
ARCHIVE_PATH = '~/Documents/tmp/'
ARCHIVE_FILE_NAME = "db-backup_iOS__"


def compress_folder(origem, destino):
    try:
        arq = shutil.make_archive(destino, 'zip', root_dir=origem, base_dir=origem)
    except Exception as e:
        print('\n\nAn error was found during compression:')
        print(e)


timestamp = str(datetime.datetime.now())
input_path = os.path.expanduser(INPUT_FOLDER)
archive_path = os.path.expanduser(ARCHIVE_PATH + ARCHIVE_FILE_NAME + timestamp)

compress_folder(input_path, archive_path)

我很顺利,除了一件事:生成的zip存档通过复制完整的原始路径来提取其内容。我想要的是获取存档时文件夹的简单副本,其原始名称和相关路径的内容。

我正在寻找一个简单而简短的解决方案,不需要迭代文件夹内容。

shutil.make_archive()是否可以实现,或者我需要深入了解其他模块,例如zipfile

1 个答案:

答案 0 :(得分:0)

使用arcname参数控制zip文件中的名称/路径。

&myArray[3][2] - &myArray[0][0]

使用如下目录结构:

#!/usr/bin/env python2.7

import os
import zipfile

def zip(src, dst):
   zf = zipfile.ZipFile("%s.zip" % (dst), "w", zipfile.ZIP_DEFLATED)
   abs_src = os.path.abspath(src)
   for dirname, subdirs, files in os.walk(src):
       for filename in files:
          absname = os.path.abspath(os.path.join(dirname, filename))
          arcname = absname[len(abs_src) + 1:]
          print 'zipping %s as %s' % (os.path.join(dirname, filename), arcname)
          zf.write(absname, arcname)
   zf.close()
zip("src", "dst")