Python札記 -- 文件壓縮

    在平常工做當中免不了要對文件進行壓縮,Python標準庫裏也提供了實現壓縮功能的模塊。python

    1、簡單的例子    函數

    首先了解一下壓縮單個文件在Python中怎麼實現。竹風建了個測試文件夾zip_text,裏面有test.apk和zip_model_test.py兩個文件。以下圖所示: 
測試

目標是將test.apk打包成test.zip。編寫以下代碼:spa

 1 #!/usr/bin/env python
 2 #coding:utf-8
 3  
 4 import zipfile
 5  
 6 file = '/home/jacky/tmp/zip_test/test.apk'
 7  
 8 f = zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED)
 9 f.write(file)
10 f.close()

首先使用ZipFile打開一個壓縮文件,而後將須要壓縮的文件經過write方法傳入,最後close便可。跟普通文件的讀寫操做是一致的。執行後的效果以下:code

    2、重寫壓縮包裏的目錄結構    blog

    壓縮單個文件的功能已經實現了,美中不足的是,壓縮包裏面的目錄結構跟傳進去的參數結構是同樣的。
    能夠經過在write方法傳遞arcname參數來設置路徑(wirte的函數原型爲ZipFile.write(filename[, arcname[, compress_type]]))。修改代碼以下:ip

 1 #!/usr/bin/env python
 2 #coding:utf-8
 3 
 4 import zipfile
 5 
 6 file = '/home/jacky/tmp/zip_test/test.apk'
 7 
 8 f = zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED)
 9 f.write(file, '/res/new_file_name.apk')
10 f.close()

    3、壓縮目錄   utf-8

    可是更多的狀況是要壓縮一個文件夾。直接將文件夾做爲參數傳入,會有什麼樣的效果呢?文檔

 1 #!/usr/bin/env python
 2 #coding:utf-8
 3 
 4 import zipfile
 5 
 6 file = '/home/jacky/tmp/zip_test/'
 7 
 8 f = zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED)
 9 f.write(file)
10 f.close()

執行代碼後,的確生成了一個壓縮文件,惋惜解壓這個文件的時候,卻發現裏面只有文件夾的結構,一個文件都沒有。。。
原型

     想達到壓縮文件夾的效果,得藉助一下glob模塊了。藉助glob.glob(pathname)來得到一個由指定文件夾下的文件名組成的列表,而後對此進行遍歷,代碼以下:

 1 #!/usr/bin/env python
 2 #coding:utf-8
 3 
 4 import zipfile
 5 import glob
 6 
 7 files = glob.glob('/home/jacky/tmp/zip_test/zip_dir_test/*')
 8 f = zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED)
 9 
10 for file in files:
11     f.write(file)
12 f.close()

效果以下:

    生成的壓縮包還能夠更完美些,好比保留源文件的名字,修改一下壓縮包裏面的目錄結構。借組os模塊的os.path.basename(path),能夠取得文件名,修改後代碼以下:

 1 #!/usr/bin/env python
 2 #coding:utf-8
 3 
 4 import zipfile
 5 import glob
 6 import os
 7 
 8 files = glob.glob('/home/jacky/tmp/zip_test/zip_dir_test/*')
 9 f = zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED)
10 
11 for file in files:
12     f.write(file, '/MyDirPath/' + os.path.basename(file))
13 f.close()

 這樣就能夠根據實際須要生成壓縮包裏面的目錄結構了。

    4、其餘功能

    既然能夠壓縮,固然Python也提供瞭解壓的方法。ZipFile.extractall([path[, members[, pwd]]]),path爲解壓路徑,members爲須要解壓的文件,另外若是壓縮文件有密碼時,須要輸入pwd。    ZipFile模塊內還有不少實用的功能,限於篇幅所限,就不一一敘述了,你們可查閱Python的官方文檔。

相關文章
相關標籤/搜索