Pythonのzipfileモジュール

zipfileを作る

zip圧縮方法としてzipfile.ZIP_DEFLATEDか、zipfile.ZIP_STOREDを渡す。

# zipファイルを作る(zlibモジュールを使って圧縮)
with zipfile.ZipFile('compressed.zip', 'w', zipfile.ZIP_DEFLATED) as f:
    f.write('a.txt')
    f.write('b.txt')
    f.write('c.txt')


# zipファイルを作る(圧縮しない)
with zipfile.ZipFile('not_compressed.zip', 'w', zipfile.ZIP_STORED) as f:
    f.write('a.txt')
    f.write('b.txt')
    f.write('c.txt')

zipファイルかどうか調べる

is_zipfileで

print zipfile.is_zipfile('a.txt')
# => False
print zipfile.is_zipfile('compressed.zip')
# => True
print zipfile.is_zipfile('not_compressed.zip')
# => True

zipfileの中身を見る

namelistでファイル名のリストを取得
infolistでZipInfoオブジェクトのリストを取得
ZipInfoオブジェクトにはファイルの情報がいろいろ保存されていて圧縮前、後のサイズなんかもわかる
zipfile.ZIP_STOREDで作成したzipファイルのほうはサイズが変わっていないことを確認できる

# zipの中身を見る
def print_info(zip_info):
    print "\tファイル名:\t", zip_info.filename
    print '\tコメント:\t', zip_info.comment
    print '\t最終更新日時:\t', datetime.datetime(*zip_info.date_time)
    print '\t圧縮形式:\t', zip_info.compress_type
    print '\t圧縮後データサイズ:\t', zip_info.compress_size, 'bytes'
    print '\t圧縮前データサイズ:\t', zip_info.file_size, 'bytes'


with zipfile.ZipFile('compressed.zip', 'r') as f:

    # ファイルの一覧
    print f.namelist()
    # => ['a.txt', 'b.txt', 'c.txt']

    # ファイルの情報一覧
    for info in  f.infolist():
        print_info(info)
	 # => ファイル名:	a.txt
 	 # => コメント:	
	 # => 最終更新日時:	2012-08-04 14:57:42
	 # => 圧縮形式:	8
	 # => 圧縮後データサイズ:	29 bytes
	 # => 圧縮前データサイズ:	10001 bytes
	 # => ファイル名:	b.txt
	 # => コメント:	
	 # => 最終更新日時:	2012-08-04 14:57:54
	 # => 圧縮形式:	8
	 # => 圧縮後データサイズ:	29 bytes
	 # => 圧縮前データサイズ:	10001 bytes
	 # => ファイル名:	c.txt
	 # => コメント:	
	 # => 最終更新日時:	2012-08-04 14:58:02
	 # => 圧縮形式:	8
	 # => 圧縮後データサイズ:	29 bytes
	 # => 圧縮前データサイズ:	10001 bytes


with zipfile.ZipFile('not_compressed.zip', 'r') as f:
    # ファイルの一覧
    print f.namelist()
    # => ['a.txt', 'b.txt', 'c.txt']

    # ファイルの情報一覧
    for info in  f.infolist():
        print_info(info)
	 # => ファイル名:	a.txt
	 # => コメント:	
	 # => 最終更新日時:	2012-08-04 14:57:42
	 # => 圧縮形式:	0
	 # => 圧縮後データサイズ:	10001 bytes
	 # => 圧縮前データサイズ:	10001 bytes
	 # => ファイル名:	b.txt
	 # => コメント:	
	 # => 最終更新日時:	2012-08-04 14:57:54
	 # => 圧縮形式:	0
	 # => 圧縮後データサイズ:	10001 bytes
	 # => 圧縮前データサイズ:	10001 bytes
	 # => ファイル名:	c.txt
	 # => コメント:	
	 # => 最終更新日時:	2012-08-04 14:58:02
	 # => 圧縮形式:	0
	 # => 圧縮後データサイズ:	10001 bytes
	 # => 圧縮前データサイズ:	10001 bytes	

zipにファイル追加

zipfile.ZipFileでmodeに'a'を指定してファイルを開けばzipにファイルを追加できる

with zipfile.ZipFile('compressed.zip', 'a', zipfile.ZIP_DEFLATED) as f:
    f.write('d.txt')
with zipfile.ZipFile('compressed.zip', 'r') as f:
    print f.namelist()
    # => ['a.txt', 'b.txt', 'c.txt', 'd.txt']

with zipfile.ZipFile('not_compressed.zip', 'a', zipfile.ZIP_STORED) as f:
    f.write('d.txt')
with zipfile.ZipFile('not_compressed.zip', 'r') as f:
    print f.namelist()
    # => ['a.txt', 'b.txt', 'c.txt', 'd.txt']

zipからファイルを取りだす

ZipFile.readでファイル名を指定してファイルの内容をバイト列で取得できる

# zipからファイルを取り出す
with zipfile.ZipFile('compressed.zip', 'r') as f:
    print f.read('a.txt')

with zipfile.ZipFile('not_compressed.zip', 'r') as f:
    print f.read('a.txt')


参考)
http://www.python.jp/doc/release/library/zipfile.html#module-zipfile