Pythonでgzipを解凍&圧縮

swfmillメーリングリストの過去ログを読もうとしたらgzipで圧縮されてまして。。。まとめて解凍するツールを持ってなかったのでPythonで。

次回用にメモ
<<追記>>
圧縮する方法もメモ
5/3 zlibモジュールについて追記

コマンドプロンプトにて、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
Tags:

Related posts

Tags:

Leave a Reply