Pythonでgzipを解凍&圧縮

[pukiwiki]
[[swfmill:http://swfmill.org/]]の[[メーリングリストの過去ログ:http://osflash.org/pipermail/swfmill_osflash.org/]]を読もうとしたらgzipで圧縮されてまして。。。まとめて解凍するツールを持ってなかったのでPythonで。

次回用にメモ
<<追記>>
[[圧縮する方法もメモ:http://boxheadroom.com/2009/05/02/python-gzip#compress]]
[[5/3 zlibモジュールについて追記:http://boxheadroom.com/2009/05/02/python-gzip#zlib]]
[/pukiwiki]

コマンドプロンプトにて、gzアーカイブが有るフォルダをカレントフォルダにして

python -c "import gzip,glob;[open(fn[:-3],'wb').write(gzip.open(fn).read()) for fn in glob.glob('*.gz')]"

右端がはみ出して読めなくてすんません

清書するとこんな感じ

import gzip
from glob import glob
flist=glob("*.gz")
for fn in flist:
    #print fn
    dat=gzip.open(fn).read()
    open(fn[:-3],"wb").write(dat)


ファイルに出力

import gzip

fp=gzip.GzipFile("helloworld.txt.gz","wb")
fp.write("hello world\n")
fp.close()

gzipでの圧縮結果を文字列として取得

import gzip
import StringIO

fp1=StringIO.StringIO()
fp=gzip.GzipFile(fileobj=fp1,mode="wb")
fp.write("hello world\n")
fp.close()
dat=fp1.getvalue() # get as string

open("hello.txt.gz","wb").write(dat)  # save as file

二つの文字列の類似度を計算するのに、それぞれを圧縮したときのサイズと、二つまとめて圧縮したときのサイズを比べる、というある手法があるみたいです。
こういうときは直に文字列で取得できたほうがよいかも。

文字列のみで取り回したい場合は、上記のようにStringIOモジュールを使うよりも、zlibモジュールを使ったほうが良いみたいです。

# -*- coding: utf-8 -*-
import zlib
txt="hello world"
compressed=zlib.compress(txt)  #文字列を圧縮
print compressed.encode("hex") #16進数で表示
txt2=zlib.decompress(compressed) #解凍
print txt2

[pukiwiki]
-[[zlib — gzip 互換の圧縮:http://www.python.jp/doc/release/lib/module-zlib.html]]
-[[Similar String algorithm compression-based distance(stackoverflow):http://stackoverflow.com/questions/451884/similar-string-algorithm/452956#452956]]
-[[圧縮を用いた類似度判定のための計算実験(PDF):http://www.tani.cs.chs.nihon-u.ac.jp/g-2008/shu/tyukan_shu.pdf]]

ToDo : Drag&Dropして解凍するのは、またいずれ。。。
[/pukiwiki]

コメントを残す

メールアドレスが公開されることはありません。