在Python中处理zip文件(含工具类)

用实例说明如何用 Python 处理 zip 文件

来源:(http://blog.sina.com.cn/s/blog_620c017e0100ey32.html ) - 在Python中处理zip文件_夜雨敲窗_新浪博客

有时我们需要在 Python 中使用 zip 文件,而在1.6版中,Python 就已经提供了 zipfile 模块可以进行这样的操作。不过 Python 中的 zipfile 模块不能处理多卷的情况,不过这种情况并不多见,因此在通常情况下已经足够使用了。下面我只是对一些基本的 zipfile 操作进行了记录,足以应付大部分的情况了。

zipfile 模块可以让你打开或写入 一个 zip 文件。比如:

import zipfile

z = zipfile.ZipFile('zipfilename', mode='r')

 

这样就打开了一个 zip 文件,如果mode为'w'或'a'则表示要写入一个 zip 文件。如果是写入,则还可以跟上第三个参数:

  compression=zipfile.ZIP_DEFLATED

  compression=zipfile.ZIP_STORED

ZIP_DEFLATED是压缩标志,如果使用它需要编译了zlib模块。而后一个只是用zip进行打包,并不压缩。

在打开了zip文件之后就可以根据需要是读出zip文件的内容还是将内容保存到 zip 文件中。

读出zip中的内容

很简单,zipfile 对象提供了一个read(name)的方法。name为zip文件中的一个文件入口,执行完成之后,将返回读出的内容,你把它保存到想到的文件中即可。

写入zip文件

有两种方式,一种是直接写入一个已经存在的文件,另一种是写入一个字符串。

对 于第一种使用 zipfile 对象的 write(filename, arcname, compress_type),后两个参数是可以忽略的。第一个参数是文件名,第二个参数是表示在 zip 文件中的名字,如果没有给出,表示使用与filename一样的名字。compress_type是压缩标志,它可以覆盖创建 zipfile 时的参数。第二种是使用 zipfile 对象的 writestr(zinfo_or_arcname, bytes),第一个参数是 zipinfo 对象或写到压缩文件中的压缩名,第二个参数是字符串。使用这个方法可以动态的组织文件的内容。

需要注意的是在读出时,因为只能读出内容,因此如果想实现按目录结构展开 zip 文件的话,这些操作需要自已来完成,比如创建目录,创建文件并写入。而写入时,则可以根据需要动态组织在 zip 文件中的目录结构,这样可以不按照原来的目录结构来生成 zip 文件。

于是我为了方便使用,创建了自已的一个 ZFile 类,主要是实现象 winrar 的右键菜单中的压缩到的功能--即将一个zip文件压缩到指定目录,自动创建相应的子目录。再有就是方便生成 zip 文件。类源码为:


  1. import  zipfile 
  2. import  os.path 
  3. import  os 
  4.  
  5. class  ZFile(object): 
  6.     def  __init__( self , filename, mode= 'r' , basedir= '' ): 
  7.         self .filename = filename 
  8.         self .mode = mode 
  9.         if   self .mode  in  ( 'w' 'a' ): 
  10.             self .zfile = zipfile.ZipFile(filename,  self .mode, compression=zipfile.ZIP_DEFLATED) 
  11.         else
  12.             self .zfile = zipfile.ZipFile(filename,  self .mode) 
  13.         self .basedir = basedir 
  14.         if   not   self .basedir: 
  15.             self .basedir = os.path.dirname(filename) 
  16.         
  17.     def  addfile( self , path, arcname= None ): 
  18.         path = path.replace('//', ' /') 
  19.         if   not  arcname: 
  20.             if  path.startswith( self .basedir): 
  21.                 arcname = path[len(self .basedir):] 
  22.             else
  23.                 arcname = ''  
  24.         self .zfile.write(path, arcname) 
  25.             
  26.     def  addfiles( self , paths): 
  27.         for  path  in  paths: 
  28.             if  isinstance(path, tuple): 
  29.                 self .addfile(*path) 
  30.             else
  31.                 self .addfile(path) 
  32.             
  33.     def  close( self ): 
  34.         self .zfile.close() 
  35.         
  36.     def  extract_to( self , path): 
  37.         for  p  in   self .zfile.namelist(): 
  38.             self .extract(p, path) 
  39.             
  40.     def  extract( self , filename, path): 
  41.         if   not  filename.endswith( '/' ): 
  42.             f = os.path.join(path, filename) 
  43.             dir = os.path.dirname(f) 
  44.             if   not  os.path.exists(dir): 
  45.                 os.makedirs(dir) 
  46.             file(f, 'wb' ).write( self .zfile.read(filename)) 
  47.             
  48.         
  49. def  create(zfile, files): 
  50.     z = ZFile(zfile, 'w'
  51.     z.addfiles(files) 
  52.     z.close() 
  53.     
  54. def  extract(zfile, path): 
  55.     z = ZFile(zfile) 
  56.     z.extract_to(path) 
  57.     z.close() 

这个 zfile.py 模块提供了两个方法:create和extract,还有一个 ZFile 的类。create和extract用来创建和解压 zip 文件。

create需要两个参数,第一个为要生成的zip文件名,第二个为一个文件列表,它是一个list变量,每一项或者是一个字符串文件名,或者是一个 tuple,第一个为文件名,第二个为在压缩文件中的名字,可以有路径,如:

  ['d:/a.csv', 'd:/test/a.JPG', ('d:/test/mixin/main.py', 'main.py')]

那么对于文件名有以下的处理,如果文件列表中的文件名与压缩文件名的路径相同,则在压缩文件中会自动变成相对路径。比如上面的文件列表,如果压缩文件为:

  d:/aaaa.zip

则在压缩文件中的压缩文件名最终为:

  ['a.csv', 'test/a.JPG', 'main.py']

那么最后一个因为指定了在压缩文件中的名字,因此使用指定的名字。

extrace需要两个参数,第一个为压缩文件名,第二个为解压到的路径名。

这 两个方法都使用了 ZFile 类。ZFile 类则提供了一些更底层些的类。它的构造函数可以根据mode的值来选择是打开还是写入。另外如果还想做更底层的控制,可以通过 ZFile 实例得到 zfile 属性,它是一个 ZipFile 模块实例,可以直接使用。

你可能感兴趣的:(python,list,object,Path,import,compression)