前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python zipfile模块学习笔记

python zipfile模块学习笔记

作者头像
py3study
发布2020-01-06 11:25:15
1K0
发布2020-01-06 11:25:15
举报
文章被收录于专栏:python3python3

ZIP文件格式是一种常见的存档和压缩标准,这个zipfile模块提供了工具来创建、读取、写入、附加和列出一个ZIP文件。使用ZIP64扩展(即压缩文件大小超过4G),它能解压加密的ZIP文件,解密过程很慢。

1、测试是否为ZIP文件

is_zipfile()函数会返回一个布尔值来表示是否为ZIP文件,代码如下:

代码语言:javascript
复制
#!/usr/bin/python
import zipfile
for filename in ['print_name.py', 'python.zip', 'uwsgi', 'admin']:
    print '%20s %s' % (filename, zipfile.is_zipfile(filename))

如果文件不存在或者不是ZIP文件会返回False。

代码语言:javascript
复制
[root@www home]# python zipfile_is_zipfile.py
       print_name.py False
          python.zip True
               uwsgi False
               admin False

2、读取ZIP文件的内容

代码语言:javascript
复制
#!/usr/bin/env python
import zipfile
                                                                                                      
zf = zipfile.ZipFile('python.zip', 'r')
print zf.namelist()

使用namelist() 函数,返回结果是一个列表

代码语言:javascript
复制
[root@www home]# python zipfile_namelist.py
['test.txt']

#这只能查看ZIP文件的部分内容,使用infolist() 或者 getinfo() 可以从ZIP文件中获取更多信息,代码如下:

代码语言:javascript
复制
import datetime
import zipfile
                                                                                            
def print_info(archive_name):
    zf = zipfile.ZipFile(archive_name)
    for info in zf.infolist():
        print info.filename
        print '\tComment:\t', info.comment
        print '\tModified:\t', datetime.datetime(*info.date_time)
        print '\tSystem:\t\t', info.create_system, '(0 = Windows, 3 = Unix)'
        print '\tZIP version:\t', info.create_version
        print '\tCompressed:\t', info.compress_size, 'bytes'
        print '\tUncompressed:\t', info.file_size, 'bytes'
        print
                                                                                            
if __name__ == '__main__':
    print_info('python.zip')

执行上面代码显示如下结果:

代码语言:javascript
复制
[root@www home]# python zipfile_infolist.py
test.txt
    Comment:   
    Modified:   2013-09-06 20:09:58
    System:     3 (0 = Windows, 3 = Unix)
    ZIP version:    20
    Compressed: 419430400 bytes
    Uncompressed:   419430400 bytes

使用getinfo()函数可以在ZIP文件内查找内容,代码如下:

代码语言:javascript
复制
#!/usr/bin/env python
import zipfile
                                                                                  
zf = zipfile.ZipFile('python.zip')
for filename in ['test.txt', 'notthere.txt']:
    try:
        info = zf.getinfo(filename)
    except KeyError:
        print 'ERROR: Did not find %s in zip file' % filename
    else:
        print "%s is %d bytes" % (info.filename, info.file_size)

如果需要查找的不存在ZIP文档里,会返回一个KeyError错误。

代码语言:javascript
复制
[root@www home]# python zipfile_getinfo.py
test.txt is 419430400 bytes
ERROR: Did not find notthere.txt in zip file

3、从一个ZIP文档中提取文件

代码语言:javascript
复制
#!/usr/bin/env python
import zipfile
                                                                        
zf = zipfile.ZipFile('python.zip')
for filename in ['test.txt', 'notihere.txt']:
    try:
        data = zf.read(filename)
    except KeyError:
        print 'ERROR: Did not find %s in zip file' % filename
    else:
        print filename, ':'
        print repr(data)
    print

要提取的文件会被自动解压:

代码语言:javascript
复制
[root@www home]# python zipfile_read.py
                                                                   
README.txt :
'The examples for the zipfile module use this file and example.zip as data.\n'
                                                                   
ERROR: Did not find notthere.txt in zip file

4、创建一个新的ZIP文件

创建新的ZIP归档文件代码如下:

代码语言:javascript
复制
#!/usr/bin/env python
                                                           
from zipfile_infolist import print_info
import zipfile
                                                           
print 'creating archive'
zf = zipfile.ZipFile('zipfile_write.zip', 'w')
try:
    print 'adding text.txt'
    zf.write('text.txt')
finally:
    print 'closing'
    zf.close()
                                                           
print
print_info('zipfile_write.zip')

默认情况下不会对文件进行压缩:

代码语言:javascript
复制
[root@www home]# python zipfile_write.py
creating archive
adding text.txt
closing
                                                    
text.txt
    Comment:   
    Modified:   2013-09-06 20:39:52
    System:     3 (0 = Windows, 3 = Unix)
    ZIP version:    20
    Compressed: 104857600 bytes
    Uncompressed:   104857600 bytes

如果要对文件进行压缩,zlib模块是必须的,如果zlib可以使用,你可以使用zipfile.ZIP_DEFLATED设置压缩模式为单个文件或者归档一个整体。默认的压缩模式是zipfile.ZIP_STORED。

代码语言:javascript
复制
#!/usr/bin/env python
                                               
from zipfile_infolist import print_info
import zipfile
try:
    import zlib
    compression = zipfile.ZIP_DEFLATED
except:
    compression = zipfile.ZIP_STORED
                                               
modes = { zipfile.ZIP_DEFLATED: 'deflated',
          zipfile.ZIP_STORED:   'stored',
          }
                                               
print 'creating archive'
zf = zipfile.ZipFile('zipfile_write_compression.zip', mode='w')
try:
    print 'adding text.txt with compression mode', modes[compression]
    zf.write('text.txt', compress_type=compression)
finally:
    print 'closing'
    zf.close()
                                               
print
print_info('zipfile_write_compression.zip')

这次文件被压缩:

代码语言:javascript
复制
[root@www home]# python zipfile_write_compression.py
creating archive
adding text.txt with compression mode deflated
closing
                                          
text.txt
    Comment:   
    Modified:   2013-09-06 20:39:52
    System:     3 (0 = Windows, 3 = Unix)
    ZIP version:    20
    Compressed: 101923 bytes
    Uncompressed:   104857600 bytes

替换原始文件名:

代码语言:javascript
复制
#!/usr/bin/env python
                                     
from zipfile_infolist import print_info
import zipfile
                                     
zf = zipfile.ZipFile('zipfile_write_arcname.zip', mode='w')
try:
    zf.write('text.txt', arcname='NOT_README.txt')
finally:
    zf.close()
print_info('zipfile_write_arcname.zip')

结果显示原始文件名已经被替换了:

代码语言:javascript
复制
[root@www home]# python zipfile_write_arcname.py
NOT_README.txt
    Comment:   
    Modified:   2013-09-06 20:39:52
    System:     3 (0 = Windows, 3 = Unix)
    ZIP version:    20
    Compressed: 104857600 bytes
    Uncompressed:   104857600 bytes

本文参考:http://docs.python.org/2/library/zipfile

http://pymotw.com/2/zipfile/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档