zipfile

zip文件格式是通用的文檔壓縮標準,在ziplib模塊中,使用ZipFile類來操作zip文件,下面具體介紹一下:

class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])
  創建一個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。

  ZipFile還提供瞭如下常用的方法和屬性:

ZipFile.getinfo(name):
  獲取zip文檔內指定文件的信息。返回一個zipfile.ZipInfo對象,它包括文件的詳細信息。將在下面 具體介紹該對象。

ZipFile.infolist()

  獲取zip文檔內所有文件的信息,返回一個zipfile.ZipInfo的列表。

ZipFile.namelist()
  獲取zip文檔內所有文件的名稱列表。

ZipFile.extract(member[, path[, pwd]])
  將zip文檔內的指定文件解壓到當前目錄。參數member指定要解壓的文件名稱或對應的ZipInfo對象;參數path指定了解析文件保存的文件夾;參數pwd爲解壓密碼。下面一個例子將保存在程序根目錄下的txt.zip內的所有文件解壓到D:/Work目錄:

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

def unzip():
zip_path="c://a.zip"
save_path = "c://a"
zipfile.ZipFile(zip_path).extractall(save_path)
=================
ZipFile裏有兩個非常重要的class, 分別是ZipFile和ZipInfo, 在絕大多數的情況下,我們只需要使用這兩個class就可以了。ZipFile是主要的類,用來創建和讀取zip文件而ZipInfo是存儲的zip文件的每個文件的信息的。

比如要讀取一個Python ZipFile模塊,這裏假設filename是一個文件的路徑:

  1. import ZipFile  
  2. z = ZipFile.ZipFile(filename, 'r') 
    # 這裏的第二個參數用r表示是讀取zip文件,w是創建一個zip文件  
  3. for f in z.namelist():  
  4. print f 

 

上面的代碼是讀取一個zip壓縮包裏所有文件的名字。z.namelist() 會返回壓縮包內所有文件名的列表。

再看看下面一個:

 

 

  1. import ZipFile  
  2. z = ZipFile.ZipFile(filename, 'r')  
  3. for i in z.infolist():  
  4. print i.file_size, i.header_offset 

 

這裏使用了z.infolist(), 它返回的就是壓縮包內所有文件的信息,就是一個ZipInfo的列表。一個ZopInfo對象中包含了壓縮包內一個文件的信息,其中比較常用的是 filename, file_size, header_offset, 分別爲文件名,文件大小,文件數據在壓縮包中的偏移。其實之前的z.namelist()就是讀取的ZopInfo中的filename,組成一個 list返回的。
從壓縮包裏解壓縮出一個文件的方法是使用ZipFile的read方法:

 

 

  1. import ZipFile  
  2. z = ZipFile.ZipFile(filename, 'r')  
  3. print z.read(z.namelist()[0]) 

 

這樣就讀取出z.namelist()中的第一個文件,並且輸出到屏幕,當然也可以把它存儲到文件。

下面是創建zip壓縮包的方法:

與讀取的方法其實很類似的:

 

 

  1. import ZipFile, os  
  2. z = ZipFile.ZipFile(filename, 'w') 
    # 注意這裏的第二個參數是w,這裏的filename是壓縮包的名字 

 

假設要把一個叫testdir中的文件全部添加到壓縮包裏(這裏只添加一級子目錄中的文件):

  1. if os.path.isdir(testdir):  
  2. for d in os.listdir(testdir):  
  3. z.write(testdir+os.sep+d)  
  4. # close() 是必須調用的!  
  5. z.close() 

上面的代碼非常的簡單。想想還有一個問題,如果我把一個test/111.txt 添加到壓縮包裏之後我希望在包裏它放到test22/111.txt怎麼辦呢?其實這個就是Python ZipFile模塊的write方法中第二個參數的作用了。只需要這樣調用:

  1. 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 文件註釋 (不定長度)
詳細出處參考:http://www.jb51.net/article/16908.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章