为了账号安全,请及时绑定邮箱和手机立即绑定

python zipfile模块学习笔记(一)

标签:
Python


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

1、测试是否为ZIP文件

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

#!/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。

[root@www home]# python zipfile_is_zipfile.py

       print_name.py False

          python.zip True

               uwsgi False

               admin False

2、读取ZIP文件的内容

#!/usr/bin/env python

import zipfile

                                                                                                      

zf = zipfile.ZipFile('python.zip', 'r')

print zf.namelist()

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

[root@www home]# python zipfile_namelist.py

['test.txt']

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

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

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

[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文件内查找内容,代码如下:

#!/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错误。

[root@www home]# python zipfile_getinfo.py

test.txt is 419430400 bytes

ERROR: Did not find notthere.txt in zip file

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

#!/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

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

[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归档文件代码如下:

#!/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')

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

[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。

#!/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')

这次文件被压缩:

[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

替换原始文件名:

#!/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')

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

[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

更多博文请移步:linux开源技术博客 http://www.chlinux.net

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

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

©著作权归作者所有:来自51CTO博客作者1594cqb的原创作品,如需转载,请注明出处,否则将追究法律责任

归档pythonzippython


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消