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