您的位置:首页 > 编程语言 > Python开发

python将文件夹打包成zip并保存历史版本

2020-07-02 22:12 78 查看
#!python3
#将一个文件夹及以下的所有文件打包成zip文件

import zipfile,os,re

def backup2zip(floder,backupfilename):	#floder:要打包的文件夹;backupfilename:指定文件名

hisname = re.compile(backupfilename + '(_)?(\\d+)?' +'.zip')
floder = os.path.abspath(floder)
num = [1]

allFiles = os.listdir(os.getcwd())    #历史备份文件名列表
for i in allFiles:
mo = hisname.search(i)
if mo:
num.append(int(mo.group(2)) + 1)

backupfilename = backupfilename + '_' + str(num[-1]) + '.zip'
f = zipfile.ZipFile(backupfilename,'w')    #c创建一个zip对象

for floderName, subFolders, fileNames in os.walk(floder):
f.write(floderName)
for subFolder in subFolders:
f.write(os.path.join(floderName,subFolder))
for fileName in fileNames:
f.write(os.path.join(floderName,fileName))
f.close()

#backup2zip('.\\zipexample','backupfile')

期间遇到两个问题,一个是

[Errno 13] Permission denied
,这个问题原因在
zipfile.ZipFile(path)
的路径参数中必须指定文件名后缀
.zip
,否则报错如下:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\lib\zipfile.py", line 1249, in __init__
self.fp = io.open(file, filemode)
PermissionError: [Errno 13] Permission denied: 'zipexample'

另外

zipfile.ZipFile()
,默认打开方式是读,即
'r'
,要创建zip文件时需要修改成
'w'
,否则非找不到路径。其次write()在写入过程中会将指定路径全部写入zip文件。

关于路径是从根目录开始写的,否则会读取不到。比如我这个程序放在E盘,我想压缩D盘的一个文件:

...
floder = os.path.abspath(floder)
print(floder)
...
#backup2zip('.\\zipexample','hi')
backup2zip('.\\..\\..\\..\\..\\..\\d:\\myfiles\\hi','hi')

输出结果是:

#E:\python\aliyunclass\newdir\projects\zipexample
E:\d:\myfiles\hi

第二行会读取不到文件,直接输入D盘文件的绝对地址就好了。写入的时候会从该根目录开始将路径上的所有文件夹全部

另一个错误是

IndentationError: expected an indented block
,原因在把if或else里的语句全部注释了。先将逻辑块占位就解决了。

然后将在

main.py
中引用这个模块后报错。

import backup2zip

backup2zip('zipexample','backupfile')

--------------------------------------------
Traceback (most recent call last):
File "main.py", line 3, in <module>
backup2zip('zipexample','backupfile')
TypeError: 'module' object is not callable

原因是忘记引用需要模块名加方法,即

backup2zip.backup2zip()

还有一点值得注意的是,要记得关闭ZipFile对象,否则会出现无法读取或解压的情况,如下

f = zipfile.ZipFile('zipexample.zip')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\lib\zipfile.py", line 1267, in __init__
self._RealGetContents()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\lib\zipfile.py", line 1334, in _RealGetContents
raise BadZipFile("File is not a zip file")
zipfile.BadZipFile: File is not a zip file

该文件一直处于编辑中的状态,压缩软件自然也无法读取。

关于引用模块后,生成的

__pycache__
文件夹的作用参考:pyhton中__pycache__文件夹的产生与作用

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: