天天看點

python zipfile子產品學習筆記(一)

ZIP檔案格式是一種常見的存檔和壓縮标準,這個zipfile子產品提供了工具來建立、讀取、寫入、附加和列出一個ZIP檔案。使用ZIP64擴充(即壓縮檔案大小超過4G),它能解壓加密的ZIP檔案,解密過程很慢。

1、測試是否為ZIP檔案

is_zipfile()函數會傳回一個布爾值來表示是否為ZIP檔案,代碼如下:

1

2

3

4

<code>#!/usr/bin/python</code>

<code>import</code> <code>zipfile</code>

<code>for</code> <code>filename </code><code>in</code> <code>[</code><code>'print_name.py'</code><code>, </code><code>'python.zip'</code><code>, </code><code>'uwsgi'</code><code>, </code><code>'admin'</code><code>]:</code>

<code>    </code><code>print</code> <code>'%20s %s'</code> <code>%</code> <code>(filename, zipfile.is_zipfile(filename))</code>

如果檔案不存在或者不是ZIP檔案會傳回False。

5

<code>[root@www home]</code><code># python zipfile_is_zipfile.py</code>

<code>       </code><code>print_name.py </code><code>False</code>

<code>          </code><code>python.</code><code>zip</code> <code>True</code>

<code>               </code><code>uwsgi </code><code>False</code>

<code>               </code><code>admin </code><code>False</code>

2、讀取ZIP檔案的内容

<code>#!/usr/bin/env python</code>

<code>                                                                                                      </code> 

<code>zf </code><code>=</code> <code>zipfile.ZipFile(</code><code>'python.zip'</code><code>, </code><code>'r'</code><code>)</code>

<code>print</code> <code>zf.namelist()</code>

使用namelist() 函數,傳回結果是一個清單

<code>[root@www home]# python zipfile_namelist.py</code>

<code>[</code><code>'test.txt'</code><code>]</code>

#這隻能檢視ZIP檔案的部分内容,使用infolist() 或者 getinfo() 可以從ZIP檔案中擷取更多資訊,代碼如下:

6

7

8

9

10

11

12

13

14

15

16

17

<code>import</code> <code>datetime</code>

<code>                                                                                            </code> 

<code>def</code> <code>print_info(archive_name):</code>

<code>    </code><code>zf </code><code>=</code> <code>zipfile.ZipFile(archive_name)</code>

<code>    </code><code>for</code> <code>info </code><code>in</code> <code>zf.infolist():</code>

<code>        </code><code>print</code> <code>info.filename</code>

<code>        </code><code>print</code> <code>'\tComment:\t'</code><code>, info.comment</code>

<code>        </code><code>print</code> <code>'\tModified:\t'</code><code>, datetime.datetime(</code><code>*</code><code>info.date_time)</code>

<code>        </code><code>print</code> <code>'\tSystem:\t\t'</code><code>, info.create_system, </code><code>'(0 = Windows, 3 = Unix)'</code>

<code>        </code><code>print</code> <code>'\tZIP version:\t'</code><code>, info.create_version</code>

<code>        </code><code>print</code> <code>'\tCompressed:\t'</code><code>, info.compress_size, </code><code>'bytes'</code>

<code>        </code><code>print</code> <code>'\tUncompressed:\t'</code><code>, info.file_size, </code><code>'bytes'</code>

<code>        </code><code>print</code>

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>

<code>    </code><code>print_info(</code><code>'python.zip'</code><code>)</code>

執行上面代碼顯示如下結果:

<code>[root@www home]</code><code># python zipfile_infolist.py</code>

<code>test.txt</code>

<code>    </code><code>Comment:  </code>

<code>    </code><code>Modified:   </code><code>2013</code><code>-</code><code>09</code><code>-</code><code>06</code> <code>20</code><code>:</code><code>09</code><code>:</code><code>58</code>

<code>    </code><code>System:     </code><code>3</code> <code>(</code><code>0</code> <code>=</code> <code>Windows, </code><code>3</code> <code>=</code> <code>Unix)</code>

<code>    </code><code>ZIP</code> <code>version:    </code><code>20</code>

<code>    </code><code>Compressed: </code><code>419430400</code> <code>bytes</code>

<code>    </code><code>Uncompressed:   </code><code>419430400</code> <code>bytes</code>

使用getinfo()函數可以在ZIP檔案内查找内容,代碼如下:

<code>                                                                                  </code> 

<code>zf </code><code>=</code> <code>zipfile.ZipFile(</code><code>'python.zip'</code><code>)</code>

<code>for</code> <code>filename </code><code>in</code> <code>[</code><code>'test.txt'</code><code>, </code><code>'notthere.txt'</code><code>]:</code>

<code>    </code><code>try</code><code>:</code>

<code>        </code><code>info </code><code>=</code> <code>zf.getinfo(filename)</code>

<code>    </code><code>except</code> <code>KeyError:</code>

<code>        </code><code>print</code> <code>'ERROR: Did not find %s in zip file'</code> <code>%</code> <code>filename</code>

<code>    </code><code>else</code><code>:</code>

<code>        </code><code>print</code> <code>"%s is %d bytes"</code> <code>%</code> <code>(info.filename, info.file_size)</code>

如果需要查找的不存在ZIP文檔裡,會傳回一個KeyError錯誤。

<code>[root@www home]</code><code># python zipfile_getinfo.py</code>

<code>test.txt </code><code>is</code> <code>419430400</code> <code>bytes</code>

<code>ERROR: Did </code><code>not</code> <code>find notthere.txt </code><code>in</code> <code>zip</code> <code>file</code>

3、從一個ZIP文檔中提取檔案

<code>                                                                        </code> 

<code>for</code> <code>filename </code><code>in</code> <code>[</code><code>'test.txt'</code><code>, </code><code>'notihere.txt'</code><code>]:</code>

<code>        </code><code>data </code><code>=</code> <code>zf.read(filename)</code>

<code>        </code><code>print</code> <code>filename, </code><code>':'</code>

<code>        </code><code>print</code> <code>repr</code><code>(data)</code>

<code>    </code><code>print</code>

要提取的檔案會被自動解壓:

<code>[root@www home]# python zipfile_read.py</code>

<code>                                                                   </code> 

<code>README.txt :</code>

<code>'The examples for the zipfile module use this file and example.zip as data.\n'</code>

<code>ERROR: Did not find notthere.txt in zip file</code>

4、建立一個新的ZIP檔案

建立新的ZIP歸檔檔案代碼如下:

<code>                                                           </code> 

<code>from</code> <code>zipfile_infolist </code><code>import</code> <code>print_info</code>

<code>print</code> <code>'creating archive'</code>

<code>zf </code><code>=</code> <code>zipfile.ZipFile(</code><code>'zipfile_write.zip'</code><code>, </code><code>'w'</code><code>)</code>

<code>try</code><code>:</code>

<code>    </code><code>print</code> <code>'adding text.txt'</code>

<code>    </code><code>zf.write(</code><code>'text.txt'</code><code>)</code>

<code>finally</code><code>:</code>

<code>    </code><code>print</code> <code>'closing'</code>

<code>    </code><code>zf.close()</code>

<code>print</code>

<code>print_info(</code><code>'zipfile_write.zip'</code><code>)</code>

預設情況下不會對檔案進行壓縮:

<code>[root@www home]</code><code># python zipfile_write.py</code>

<code>creating archive</code>

<code>adding text.txt</code>

<code>closing</code>

<code>                                                    </code> 

<code>text.txt</code>

<code>    </code><code>Modified:   </code><code>2013</code><code>-</code><code>09</code><code>-</code><code>06</code> <code>20</code><code>:</code><code>39</code><code>:</code><code>52</code>

<code>    </code><code>Compressed: </code><code>104857600</code> <code>bytes</code>

<code>    </code><code>Uncompressed:   </code><code>104857600</code> <code>bytes</code>

如果要對檔案進行壓縮,zlib子產品是必須的,如果zlib可以使用,你可以使用zipfile.ZIP_DEFLATED設定壓縮模式為單個檔案或者歸檔一個整體。預設的壓縮模式是zipfile.ZIP_STORED。

18

19

20

21

22

23

24

25

<code>                                               </code> 

<code>    </code><code>import</code> <code>zlib</code>

<code>    </code><code>compression </code><code>=</code> <code>zipfile.ZIP_DEFLATED</code>

<code>except</code><code>:</code>

<code>    </code><code>compression </code><code>=</code> <code>zipfile.ZIP_STORED</code>

<code>modes </code><code>=</code> <code>{ zipfile.ZIP_DEFLATED: </code><code>'deflated'</code><code>,</code>

<code>          </code><code>zipfile.ZIP_STORED:   </code><code>'stored'</code><code>,</code>

<code>          </code><code>}</code>

<code>zf </code><code>=</code> <code>zipfile.ZipFile(</code><code>'zipfile_write_compression.zip'</code><code>, mode</code><code>=</code><code>'w'</code><code>)</code>

<code>    </code><code>print</code> <code>'adding text.txt with compression mode'</code><code>, modes[compression]</code>

<code>    </code><code>zf.write(</code><code>'text.txt'</code><code>, compress_type</code><code>=</code><code>compression)</code>

<code>print_info(</code><code>'zipfile_write_compression.zip'</code><code>)</code>

這次檔案被壓縮:

<code>[root@www home]</code><code># python zipfile_write_compression.py</code>

<code>adding text.txt with compression mode deflated</code>

<code>                                          </code> 

<code>    </code><code>Compressed: </code><code>101923</code> <code>bytes</code>

替換原始檔案名:

<code>                                     </code> 

<code>zf </code><code>=</code> <code>zipfile.ZipFile(</code><code>'zipfile_write_arcname.zip'</code><code>, mode</code><code>=</code><code>'w'</code><code>)</code>

<code>    </code><code>zf.write(</code><code>'text.txt'</code><code>, arcname</code><code>=</code><code>'NOT_README.txt'</code><code>)</code>

<code>print_info(</code><code>'zipfile_write_arcname.zip'</code><code>)</code>

結果顯示原始檔案名已經被替換了:

<code>[root@www home]</code><code># python zipfile_write_arcname.py</code>

<code>NOT_README.txt</code>

本文轉自1594cqb 51CTO部落格,原文連結:http://blog.51cto.com/wolfchen/1290229,如需轉載請自行聯系原作者