python3_zipfile_建立壓縮文件

python3_zipfile_建立壓縮文件

轉載註明來源: 本文連接 來自osnosn的博客,寫於 2020-05-08.html

  • ZipFile的compression=缺省是 ZIP_STORED(僅存儲不壓縮)。
    因此要指定爲ZIP_DEFLATED(zip算法),或ZIP_LZMA(lzma算法,壓縮率高,就是慢了點)
    • compresslevel= 要py3.7以上才支持。
  • 寫入文件,能夠用write(),或writestr()
    • write(),就不須要本身設置文件修改時間了。

例子1,建立zip

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文件建立完成

例子2,註釋

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

例子3,讀zip

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()

轉載註明來源: 本文連接 來自osnosn的博客.python

相關文章
相關標籤/搜索