轉載註明來源: 本文連接 來自osnosn的博客,寫於 2020-05-08.html
compression=
缺省是 ZIP_STORED(僅存儲不壓縮)。ZIP_DEFLATED
(zip算法),或ZIP_LZMA
(lzma算法,壓縮率高,就是慢了點)
compresslevel=
要py3.7以上才支持。write()
,或writestr()
write()
,就不須要本身設置文件修改時間了。import zipfile import time orgfilename='須要壓縮的原始文件名' fstat=os.stat(orgfilename) # 獲取文件修改時間 bname=os.path.basename(orgfilename) #去掉路徑 comment='This is a test comment.\n This is line 2.' #限制65535個字節 fzip=zipfile.ZipFile(orgfilename+'.zip','w',compression=zipfile.ZIP_DEFLATED) #py<=3.6 #fzip=zipfile.ZipFile(orgfilename+'.zip','w',compression=zipfile.ZIP_DEFLATED,compresslevel=6) #py>=3.7 fzip.comment=comment.encode('utf-8') # bytes,寫入zip自己的comment. 不管何時寫入,都是存在zip文件的末尾。 with open(orgfilename,'rb') as fin: fzip.writestr('mydir/'+bname,fin.read()) # 把文件寫入zip,zip中僅加了一層目錄mydir finfo=fzip.getinfo('mydir/'+bname) #獲取這個文件的info # 由於文件是經過writestr()寫入的,因此文件修改時間須要手工設置 finfo.date_time=time.localtime(fstat.st_mtime)[0:6] # 文件修改時間 finfo.comment=comment.encode('utf-8') #bytes, 寫入對應文件的comment.實際存在文件的末尾。 fzip.close() #zip文件建立完成
import json #zip文件的註釋能夠這麼用 COMM={} COMM['d1']=123 COMM['f1']=3.25 COMM['s1']='abcdefg' comment=json.dumps(COMM,indent=2) #用indent好看點 ... fzip.comment=comment.encode('utf-8') # bytes,寫入zip自己的comment
import zipfile from io import BytesIO import json zipname='zip的文件名' fzip=zipfile.ZipFile(zipname,'r') #打開zip文件 comm=fzip.comment.decode('utf-8') # zip自身的註釋,讀取速度比較快 print('===> zip comment:') print(comm) zipdata=json.loads(comm) # 獲取comment中的json數據 print('===> data from json:') print(repr(zipdata)) names=fzip.namelist() #獲取壓縮文件中的文件列表 finfo=fzip.getinfo(names[0]) #讀取第一個文件的屬性 print('===> mtime of file:') print('%02d-%02d-%02d %02d:%02d:%02d' % finfo.date_time) #文件修改時間 print('===> comment of file:') print(finfo.comment.decode('utf-8')) #文件的註釋 fout=BytesIO(fzip.read(names[0])) #讀取第一個文件內容,放入內存. (也能夠解壓到磁盤去) fzip.close() ... fout.close()