zip文件格式是通用的文檔壓縮標準,在ziplib模塊中,使用ZipFile類來操做zip文件,下面具體介紹一下:python
class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]]).net
建立一個ZipFile對象,表示一個zip文件。參數file表示文件的路徑或類文件對象(file-like object);參數mode指示打開zip文件的模式,默認值爲'r',表示讀已經存在的zip文件,也能夠爲'w'或'a','w'表示新建一個 zip文檔或覆蓋一個已經存在的zip文檔,'a'表示將數據附加到一個現存的zip文檔中。參數compression表示在寫zip文檔時使用的壓縮 方法,它的值能夠是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。若是要操做的zip文件大小超過2G,應該將allowZip64設置爲True。code
ZipFile還提供了以下經常使用的方法和屬性:對象
ZipFile.getinfo(name):
獲取zip文檔內指定文件的信息。返回一個zipfile.ZipInfo對象,它包括文件的詳細信息。將在下面 具體介紹該對象。blog
ZipFile.infolist() 獲取zip文檔內全部文件的信息,返回一個zipfile.ZipInfo的列表。ip
ZipFile.namelist() 獲取zip文檔內全部文件的名稱列表。資源
ZipFile.extract(member[, path[, pwd]])文檔
將zip文檔內的指定文件解壓到當前目錄。參數member指定要解壓的文件名稱或對應的ZipInfo對象;參數path指定了解析文件保存的文件夾;參數pwd爲解壓密碼。下面一個例子將保存在程序根目錄下的txt.zip內的全部文件解壓到D:/Work目錄:get
import zipfile, os
zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'txt.zip'))
for file in zipFile.namelist():
zipFile.extract(file, r'd:/Work')
zipFile.close() import zipfile, os zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'txt.zip')) for file in zipFile.namelist(): zipFile.extract(file, r'd:/Work') zipFile.close()博客
ZipFile.extractall([path[, members[, pwd]]]) 解壓zip文檔中的全部文件到當前目錄。參數members的默認值爲zip文檔內的全部文件名稱列表,也能夠本身設置,選擇要解壓的文件名稱。
ZipFile.printdir() 將zip文檔內的信息打印到控制檯上。
ZipFile.setpassword(pwd) 設置zip文檔的密碼。
ZipFile.read(name[, pwd])
獲取zip文檔內指定文件的二進制數據。下面的例子演示了read()的使用,zip文檔內包括一個txt.txt的文本文件,使用read()方法讀取其二進制數據,而後保存到D:/txt.txt。
#coding=gbk
import zipfile, os
zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'txt.zip'))
data = zipFile.read('txt.txt')
(lambda f, d: (f.write(d), f.close()))(open(r'd:/txt.txt', 'wb'), data) #一行語句就完成了寫文件操做。仔細琢磨哦~~
zipFile.close() #coding=gbk import zipfile, os zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'txt.zip')) data = zipFile.read('txt.txt') (lambda f, d: (f.write(d), f.close()))(open(r'd:/txt.txt', 'wb'), data) #一行語句就完成了寫文件操做。仔細琢磨哦~~ zipFile.close()
ZipFile.write(filename[, arcname[, compress_type]]) 將指定文件添加到zip 文檔中。filename爲文件路徑,arcname爲添加到zip文檔以後保存的名稱, 參數compress_type表示壓縮方法,它的值能夠是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。下面的例子演示瞭如何建立一個zip文檔,並將文件D:/test.doc添加到壓縮文檔中。
import zipfile, os
zipFile = zipfile.ZipFile(r'D:/test.zip'), 'w')
zipFile.write(r'D:/test.doc', 'ok.doc', zipfile.ZIP_DEFLATED)
zipFile.close() import zipfile, os zipFile = zipfile.ZipFile(r'D:/test.zip'), 'w') zipFile.write(r'D:/test.doc', 'ok.doc', zipfile.ZIP_DEFLATED) zipFile.close()
ZipFile.writestr(zinfo_or_arcname, bytes) writestr()支持將二進制數據直接寫入到壓縮文檔。
Class ZipInfo ZipFile.getinfo(name) 方法返回的是一個ZipInfo對象,表示zip文檔中相應文件的信息。它支持以下屬性:
ZipInfo.filename: 獲取文件名稱。
ZipInfo.date_time: 獲取文件最後修改時間。返回一個包含6個元素的元組:(年, 月, 日, 時, 分, 秒)
ZipInfo.compress_type: 壓縮類型。
ZipInfo.comment: 文檔說明。
ZipInfo.extr: 擴展項數據。
ZipInfo.create_system: 獲取建立該zip文檔的系統 。 ZipInfo.create_version: 獲取 建立zip文檔的PKZIP版本。
ZipInfo.extract_version: 獲取 解壓zip文檔所需的PKZIP版本。
ZipInfo.reserved: 預留字段,當前實現老是返回0。
ZipInfo.flag_bits: zip標誌位。
ZipInfo.volume: 文件頭的卷標。
ZipInfo.internal_attr: 內部屬性。
ZipInfo.external_attr: 外部屬性。
ZipInfo.header_offset: 文件頭偏移位。
ZipInfo.CRC: 未壓縮文件的CRC-32。
ZipInfo.compress_size: 獲取壓縮後的大小。
ZipInfo.file_size: 獲取未壓縮的文件大小。
下面一個簡單的例子說明這些屬性的意思:
import zipfile, os
zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'txt.zip'))
zipInfo = zipFile.getinfo('doc.doc')
print 'filename:', zipInfo.filename
print 'date_time:', zipInfo.date_time
print 'compress_type:', zipInfo.compress_type
print 'comment:', zipInfo.comment
print 'extra:', zipInfo.extra
print 'create_system:', zipInfo.create_system
print 'create_version:', zipInfo.create_version
print 'extract_version:', zipInfo.extract_version
print 'extract_version:', zipInfo.reserved
print 'flag_bits:', zipInfo.flag_bits
print 'volume:', zipInfo.volume
print 'internal_attr:', zipInfo.internal_attr
print 'external_attr:', zipInfo.external_attr
print 'header_offset:', zipInfo.header_offset
print 'CRC:', zipInfo.CRC
print 'compress_size:', zipInfo.compress_size
print 'file_size:', zipInfo.file_size
zipFile.close()
import zipfile, os
zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'txt.zip'))
zipInfo = zipFile.getinfo('doc.doc')
print 'filename:', zipInfo.filename
print 'date_time:', zipInfo.date_time
print 'compress_type:', zipInfo.compress_type
print 'comment:', zipInfo.comment
print 'extra:', zipInfo.extra
print 'create_system:', zipInfo.create_system
print 'create_version:', zipInfo.create_version
print 'extract_version:', zipInfo.extract_version
print 'extract_version:', zipInfo.reserved
print 'flag_bits:', zipInfo.flag_bits
print 'volume:', zipInfo.volume
print 'internal_attr:', zipInfo.internal_attr
print 'external_attr:', zipInfo.external_attr
print 'header_offset:', zipInfo.header_offset
print 'CRC:', zipInfo.CRC
print 'compress_size:', zipInfo.compress_size
print 'file_size:', zipInfo.file_size
zipFile.close()
感受使用zipfile模塊來處理zip文件真的很簡單。想當初在.NET平臺下,使用sharpziplib壓縮、解壓一個文件,我花了N多 時間,找了N多英文資源,才寫出一個能壓縮文件的demo。而如今使用Python,經過閱讀python手冊,一兩個小時就掌握了zipfile模塊的 基本使用。哈哈,使用Python,真爽!
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/JGood/archive/2009/07/15/4351911.aspx
================ Python 解壓縮zip文件 2010-01-28 16:11
import zipfile
ZipFile裏有兩個很是重要的class, 分別是ZipFile和ZipInfo, 在絕大多數的狀況下,咱們只須要使用這兩個class就能夠了。ZipFile是主要的類,用來建立和讀取zip文件而ZipInfo是存儲的zip文件的每一個文件的信息的。
好比要讀取一個Python ZipFile模塊,這裏假設filename是一個文件的路徑:
import ZipFile z = ZipFile.ZipFile(filename, 'r') # 這裏的第二個參數用r表示是讀取zip文件,w是建立一個zip文件 for f in z.namelist(): print f
上面的代碼是讀取一個zip壓縮包裏全部文件的名字。z.namelist() 會返回壓縮包內全部文件名的列表。
再看看下面一個:
import ZipFile z = ZipFile.ZipFile(filename, 'r') for i in z.infolist(): print i.file_size, i.header_offset
這裏使用了z.infolist(), 它返回的就是壓縮包內全部文件的信息,就是 一個ZipInfo的列表。一個ZopInfo對象中包含了壓縮包內一個文件的信息,其中比較經常使用的是 filename, file_size, header_offset, 分別爲文件名,文件大小,文件數據在壓縮包中的偏移。其實以前的z.namelist()就是讀取的ZopInfo中的filename,組成一個 list返回的。 從壓縮包裏解壓縮出一個文件的方法是使用ZipFile的read方法:
import ZipFile z = ZipFile.ZipFile(filename, 'r') print z.read(z.namelist()[0])
這樣就讀取出z.namelist()中的第一個文件,而且輸出到屏幕,固然也能夠把它存儲到文件。
下面是建立zip壓縮包的方法:
與讀取的方法其實很相似的:
import ZipFile, os z = ZipFile.ZipFile(filename, 'w') # 注意這裏的第二個參數是w,這裏的filename是壓縮包的名字
假設要把一個叫testdir中的文件所有添加到壓縮包裏(這裏只添加一級子目錄中的文件):
if os.path.isdir(testdir): for d in os.listdir(testdir): z.write(testdir+os.sep+d) # close() 是必須調用的! z.close()
上面的代碼很是的簡單。想一想還有一個問題,若是我把一個test/111.txt 添加到壓縮包裏以後我但願在包裏它放到test22/111.txt怎麼辦呢?其實這個就是Python ZipFile模塊的write方法中第二個參數的做用了。只須要這樣調用:
z.write("test/111.txt", "test22/111.txt")
以上就是咱們爲你們介紹的有關Python ZipFile模塊的相關知識。
=============== 從簡單的角度來看的話,zip格式會是個不錯的選擇,並且python對zip格式的支持夠簡單,夠好用。 1)簡單應用 若是你僅僅是但願用python來作壓縮和解壓縮,那麼就不用去翻文檔了,這裏提供一個簡單的用法,讓你一看就能明白。 import zipfile f = zipfile.ZipFile('filename.zip', 'w' ,zipfile.ZIP_DEFLATED) f.write('file1.txt') f.write('file2.doc') f.write('file3.rar') f.close() f.zipfile.ZipFile('filename') f.extractall() f.close() 不知道上面的例子是否是足夠簡單呢?
1.1 zipfile.ZipFile(fileName[, mode[, compression[, allowZip64]]]) fileName是沒有什麼疑問的了。
mode和通常的文件操做同樣,'r'表示打開一個存在的只讀ZIP文件;'w'表示清空並打開一個只寫的ZIP文件,或建立一個只寫的ZIP文件;'a'表示打開一個ZIP文件,並添加內容。
compression表示壓縮格式,可選的壓縮格式只有2個:ZIP_STORE;ZIP_DEFLATED。ZIP_STORE是默認的,表示不壓縮;ZIP_DEFLATED表示壓縮,若是你不知道什麼是Deflated,那麼建議你去補補課。
allowZip64爲True時,表示支持64位的壓縮,通常而言,在所壓縮的文件大於2G時,會用到這個選項;默認狀況下,該值爲False,由於Unix系統不支持。
1.2 zipfile.close()
說真的,這個沒什麼可說的,若是有的話,那就是你寫入的任何文件在關閉以前不會真正寫入磁盤。
1.3 zipfile.write(filename[, arcname[, compress_type]])
acrname是壓縮文件中該文件的名字,默認狀況下和filename同樣
compress_type的存在是由於zip文件容許被壓縮的文件能夠有不一樣的壓縮類型。
1.4 zipfile.extractall([path[, member[, password]]])
path解壓縮目錄,沒什麼可說的
member須要解壓縮的文件名兒列表
password當zip文件有密碼時須要該選項
對於簡單的應用,這麼多就夠了。 2)高級應用
2.1 zipfile.is_zipfile(filename)
判斷一個文件是否是壓縮文件
2.2 ZipFile.namelist() 返回文件列表
2.3 ZipFile.open(name[, mode[, password]])打開壓縮文檔中的某個文件
2.4 ZipFile.infolist()
2.5 ZipFile.getinfo(name)
上述文件返回ZipInfo對象,只不過一個返回的是列表,一個返回的是一個ZipInfo
ZipInfo類
2.6 ZipInfo.filename
2.7 ZipInfo.date_time
返回值的格式爲(year,month,date,hour,minute,second)
2.8 ZipInfo.compress_type
2.9 ZipInfo.comment
2.10ZipInfo.extra
2.11ZipInfo.create_system
2.12ZipInfo.extract_version
2.13ZipInfo.reserved 老是0
2.14ZipInfo.flag_bits
2.15ZipInfo.volume
2.16ZipInfo.internal_attr
2.17ZipInfo.external_attr
2.18ZipInfo.header_offset
2.19ZipInfo.CRC
2.20ZipInfo.file_size
2.21ZipInfo.compress_size
2.22ZipFile.testzip()
檢查每一個文件和它對應的CRC,若是有錯誤返回對應的文件列表
2.23ZipFile.setpassword(password)
2.24ZipFile.read(name[,password])
返回對應的文件
2.25ZipFile.printdir()
打印壓縮文件夾的信息
2.26ZipFile.writestr(zipinfo_or_arcname, bytes)
PyZipFile類
zipfile.PyZipFile除了上面的方法和屬性以外,還有一個特殊的方法
2.27PyZipFile.writepy(pathname,basename)
通常狀況下,僅僅壓縮.pyc和.pyo文件,不壓縮.py文件
zip文件格式信息
一個 ZIP 文件由三個部分組成:壓縮源文件數據區+壓縮源文件目錄區+壓縮源文件目錄結束標誌
1)壓縮源文件數據區
在這個數據區中每個壓縮的源文件/目錄都是一條記錄,記錄的格式以下: [文件頭+ 文件數據 + 數據描述符]
a、文件頭結構
組成 長度
文件頭標記 4 bytes (0x04034b50)
解壓文件所需 pkware 版本 2 bytes
全局方式位標記 2 bytes
壓縮方式 2 bytes
最後修改文件時間 2 bytes
最後修改文件日期 2 bytes
CRC-32校驗 4 bytes
壓縮後尺寸 4 bytes
未壓縮尺寸 4 bytes
文件名長度 2 bytes
擴展記錄長度 2 bytes
文件名 (不定長度)
擴展字段 (不定長度) b、文件數據 c、數據描述符
組成 長度
CRC-32校驗 4 bytes
壓縮後尺寸 4 bytes
未壓縮尺寸 4 bytes
這個數據描述符只在全局方式位標記的第3位設爲1時才存在(見後詳解),緊接在壓縮數據的最後一個字節後。這個數據描述符只用在不能對輸出的 ZIP 文件進行檢索時使用。例如:在一個不能檢索的驅動器(如:磁帶機上)上的 ZIP 文件中。若是是磁盤上的ZIP文件通常沒有這個數據描述符。 2)壓縮源文件目錄區
在這個數據區中每一條紀錄對應在壓縮源文件數據區中的一條數據
組成 長度
目錄中文件文件頭標記 4 bytes (0x02014b50)
壓縮使用的pkware 版本 2 bytes
解壓文件所需 pkware 版本 2 bytes
全局方式位標記 2 bytes
壓縮方式 2 bytes
最後修改文件時間 2 bytes
最後修改文件日期 2 bytes
CRC-32校驗 4 bytes
壓縮後尺寸 4 bytes
未壓縮尺寸 4 bytes
文件名長度 2 bytes
擴展字段長度 2 bytes
文件註釋長度 2 bytes
磁盤開始號 2 bytes
內部文件屬性 2 bytes
外部文件屬性 4 bytes
局部頭部偏移量 4 bytes
文件名 (不定長度)
擴展字段 (不定長度)
文件註釋 (不定長度)
3)壓縮源文件目錄結束標誌
組成 長度
目錄結束標記 4 bytes (0x02014b50)
當前磁盤編號 2 bytes
目錄區開始磁盤編號 2 bytes
本磁盤上紀錄總數 2 bytes
目錄區中紀錄總數 2 bytes
目錄區尺寸大小 4 bytes
目錄區對第一張磁盤的偏移量 4 bytes
ZIP 文件註釋長度 2 bytes
ZIP 文件註釋 (不定長度)