由于zipfile
的write
方法总是会将目标文件路径上的所有文件夹压缩进去,形成多层套娃,比如D:/资料/delicious
压缩后形成的文件夹里面就会包含delicious
的上级文件夹资料
,使用相对路径可以解决这一问题,书上的示例代码稍加更改:
- 在创建压缩文件之前,将工作文件夹改为
delicious
(目标文件夹)所在目录,即压缩到当前文件夹;在创建压缩文件之后再更改的话,就是压缩到修改前的工作路径。 - 进行压缩文件的
write
操作前,将路径改为相对路径,这样压缩文件中就不会出现delicious的上级目录
import zipfile, os
def backupToZip(folder):
folder = os.path.abspath(folder)##将工作路径改为绝对路径,方便后面更改工作目录
number = 1
while True:
zipFilename = os.path.basename(folder) + '_' + str(number) + '.zip'
if not os.path.exists(zipFilename):
break
number = number + 1
AbsPath=os.path.dirname(folder)
os.chdir(AbsPath)#将工作文件夹改为delicious(目标文件夹)所在目录,即压缩到当前文件夹
print('Creating %s...' % (zipFilename))
backupZip = zipfile.ZipFile(zipFilename, 'w')
folder=os.path.relpath(folder,AbsPath)
##路径改为相对路径,这样压缩文件中就不会出现delicious的上级目录
for foldername, subfolders, filenames in os.walk(folder):
print('Adding files in %s...' % (foldername))
backupZip.write(foldername)
for filename in filenames:
newBase = os.path.basename(folder) + '_'
if filename.startswith(newBase) and filename.endswith('.zip'):
continue
backupZip.write(os.path.join(foldername, filename))
backupZip.close()
print('Done.')
backupToZip('D:/资料/delicious')