知行编程网知行编程网  2022-01-07 17:53 知行编程网 隐藏边栏 |   抢沙发  13 
文章评分 0 次,平均分 0.0
  • ZipFile的compression=缺省是 ZIP_STORED(仅存储不压缩)。
    所以要指定为ZIP_DEFLATED(zip算法),或ZIP_LZMA(lzma算法,压缩率高,就是慢了点)

    • compresslevel= 要py3.7以上才支持。
  • 写入文件,可以用write(),或writestr()
    • write(),就不需要自己设置文件修改时间了。

例子1,创建zip,写注释,改文件的mtime

  1. import os
  2. import time
  3. import zipfile
  4.  
  5. orgfilename='需要压缩的原始文件名'
  6. fstat=os.stat(orgfilename) # 获取文件修改时间
  7. bname=os.path.basename(orgfilename) #去掉路径
  8. comment='This is a test comment.n This is line 2.' #限制65535个字节
  9.  
  10. fzip=zipfile.ZipFile(orgfilename+'.zip','w',compression=zipfile.ZIP_DEFLATED) #py<=3.6
  11. #fzip=zipfile.ZipFile(orgfilename+'.zip','w',compression=zipfile.ZIP_DEFLATED,compresslevel=6) #py>=3.7
  12. fzip.comment=comment.encode('utf-8') # bytes,写入zip本身的comment. 无论什么时候写入,都是存在zip文件的末尾。
  13.  
  14. with open(orgfilename,'rb') as fin:
  15. fzip.writestr('mydir/'+bname,fin.read()) # 把文件压缩写入zip。加了一层目录mydir在zip中.
  16. finfo=fzip.getinfo('mydir/'+bname) #获取这个文件的info
  17. # 因为文件是通过writestr()写入的,所以文件修改时间需要自己设置。否则为当前时间。
  18. finfo.date_time=time.localtime(fstat.st_mtime)[0:6] # 文件修改时间
  19. finfo.comment=comment.encode('utf-8') #bytes, 写入对应文件的comment.实际存在文件的末尾。
  20. fzip.close() #zip文件创建完成

例子2,注释中写 json 格式

  1. import json
  2.  
  3. #zip文件的注释可以这么用
  4. COMM={}
  5. COMM['d1']=123
  6. COMM['f1']=3.25
  7. COMM['s1']='abcdefg'
  8. comment=json.dumps(COMM,indent=2) #用indent好看点
  9. ...
  10. fzip.comment=comment.encode('utf-8') # bytes,写入zip本身的comment

例子3,读zip,读注释,解压文件

  1. import json
  2. import zipfile
  3. from io import BytesIO
  4.  
  5. zipname='zip的文件名'
  6. fzip=zipfile.ZipFile(zipname,'r') #打开zip文件
  7. comm=fzip.comment.decode('utf-8') # zip自身的注释,读取速度比较快
  8. print('===> zip comment:')
  9. print(comm)
  10. zipdata=json.loads(comm) # 获取comment中的json数据
  11. print('===> data from json:')
  12. print(repr(zipdata))
  13.  
  14. names=fzip.namelist() #获取压缩文件中的文件列表
  15. finfo=fzip.getinfo(names[0]) #读取第一个文件的属性
  16. print('===> mtime of file:')
  17. print('%02d-%02d-%02d %02d:%02d:%02d' % finfo.date_time) #文件修改时间
  18. print('===> comment of file:')
  19. print(finfo.comment.decode('utf-8')) #文件的注释
  20. fout=BytesIO(fzip.read(names[0])) #读取第一个文件内容,放入内存. (也可以解压到磁盘去)
  21. fzip.close()
  22. ...
  23. fout.close()

本文链接:https://www.cnblogs.com/osnosn/p/12853176.html

 

Python模块学习系列:
Python模块学习 ---- re正则表达式
Python模块学习 ---- hashlib模块
Python模块学习 ---- random模块

Python模块学习 ---- smtplib模块

Python模块学习 ---- glob模块

Python模块学习 ---- logging模块

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享