我一直在试图使用zipfile
和shutil.make_archive
模块递归创建目录的zip文件。 两种模块工作的伟大 - 除了空目录不被添加到存档。 包含其他空目录空目录也被简单地跳过。
我可以用7Zip的创建相同路径的归档和空目录将被保留。 因此,我知道这是可能的文件格式本身。 我只是不知道如何Python的范围内做到这一点。 有任何想法吗? 谢谢!
我一直在试图使用zipfile
和shutil.make_archive
模块递归创建目录的zip文件。 两种模块工作的伟大 - 除了空目录不被添加到存档。 包含其他空目录空目录也被简单地跳过。
我可以用7Zip的创建相同路径的归档和空目录将被保留。 因此,我知道这是可能的文件格式本身。 我只是不知道如何Python的范围内做到这一点。 有任何想法吗? 谢谢!
有使用的压缩文件一个例子:
import os, zipfile
from os.path import join
def zipfolder(foldername, filename, includeEmptyDIr=True):
empty_dirs = []
zip = zipfile.ZipFile(filename, 'w', zipfile.ZIP_DEFLATED)
for root, dirs, files in os.walk(foldername):
empty_dirs.extend([dir for dir in dirs if os.listdir(join(root, dir)) == []])
for name in files:
zip.write(join(root ,name))
if includeEmptyDIr:
for dir in empty_dirs:
zif = zipfile.ZipInfo(join(root, dir) + "/")
zip.writestr(zif, "")
empty_dirs = []
zip.close()
if __name__ == "__main__":
zipfolder('test1/noname/', 'zip.zip')
你需要注册一个新的归档格式要做到这一点,因为默认ZIP归档不支持。 看看现有的ZIP归档的肉 。 使自己的归档,使用,目前未使用的创建目录dirpath
变量。 我找了如何创建一个空的目录,发现这个 :
zip.writestr(zipfile.ZipInfo('empty/'), '')
有了这一点,你应该能够编写必要的代码,使其归档空目录。
这是从提升使用Python添加文件夹到一个zip文件 ,但是是唯一的功能,我已经试过的作品。 列为答案的一个不Python的2.7.3(不复制空目录和效率低下)下工作。 以下是经得起考验的:
#!/usr/bin/python
import os
import zipfile
def zipdir(dirPath=None, zipFilePath=None, includeDirInZip=True):
if not zipFilePath:
zipFilePath = dirPath + ".zip"
if not os.path.isdir(dirPath):
raise OSError("dirPath argument must point to a directory. "
"'%s' does not." % dirPath)
parentDir, dirToZip = os.path.split(dirPath)
#Little nested function to prepare the proper archive path
def trimPath(path):
archivePath = path.replace(parentDir, "", 1)
if parentDir:
archivePath = archivePath.replace(os.path.sep, "", 1)
if not includeDirInZip:
archivePath = archivePath.replace(dirToZip + os.path.sep, "", 1)
return os.path.normcase(archivePath)
outFile = zipfile.ZipFile(zipFilePath, "w",
compression=zipfile.ZIP_DEFLATED)
for (archiveDirPath, dirNames, fileNames) in os.walk(dirPath):
for fileName in fileNames:
filePath = os.path.join(archiveDirPath, fileName)
outFile.write(filePath, trimPath(filePath))
#Make sure we get empty directories as well
if not fileNames and not dirNames:
zipInfo = zipfile.ZipInfo(trimPath(archiveDirPath) + "/")
#some web sites suggest doing
#zipInfo.external_attr = 16
#or
#zipInfo.external_attr = 48
#Here to allow for inserting an empty directory. Still TBD/TODO.
outFile.writestr(zipInfo, "")
outFile.close()