python zipfile模块学习笔记(一)

简介:

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

1、测试是否为ZIP文件

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

1
2
3
4
#!/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。

1
2
3
4
5
[root@www home] # python zipfile_is_zipfile.py
        print_name.py  False
           python. zip  True
                uwsgi  False
                admin  False

2、读取ZIP文件的内容

1
2
3
4
5
#!/usr/bin/env python
import  zipfile
                                                                                                       
zf  =  zipfile.ZipFile( 'python.zip' 'r' )
print  zf.namelist()

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

1
2
[root@www home]# python zipfile_namelist.py
[ 'test.txt' ]

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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' )

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

1
2
3
4
5
6
7
8
[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文件内查找内容,代码如下:

1
2
3
4
5
6
7
8
9
10
11
#!/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错误。

1
2
3
[root@www home] # python zipfile_getinfo.py
test.txt  is  419430400  bytes
ERROR: Did  not  find notthere.txt  in  zip  file

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

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/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

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

1
2
3
4
5
6
[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归档文件代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/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' )

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

1
2
3
4
5
6
7
8
9
10
11
12
[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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/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' )

这次文件被压缩:

1
2
3
4
5
6
7
8
9
10
11
12
[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

替换原始文件名:

1
2
3
4
5
6
7
8
9
10
11
#!/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' )

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

1
2
3
4
5
6
7
8
[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

本文转自1594cqb 51CTO博客,原文链接:http://blog.51cto.com/wolfchen/1290229,如需转载请自行联系原作者
相关文章
|
2月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
301 7
|
2月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
227 0
|
2月前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
353 4
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
259 0
|
2月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
177 0
|
3月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
121 4
|
3月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
284 0
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
367 62
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
258 61
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性

推荐镜像

更多