edo1z blog

プログラミングなどに関するブログです

Python3 - gzipで圧縮・読み込み

参考:http://docs.python.jp/3/library/gzip.html

gzip.openで、gzファイルを読み込めるっぽい。 with構文については、ここに詳しい説明があった。

圧縮

バイナリ文字列を圧縮する例

import gzip
s_in = b"Lots of content here"
s_out = gzip.compress(s_in)

バイナリ文字列を数字でみてみたい。「Python バイナリデータ」に色々書いてあった。「Python 2 と Python 3 のユニコード文字列、バイト列の違いメモ」にも色々書いてあった。 b'hoge'というバイナリ文字列のイテレータは数値を返すらしい。

s_in = b"Lots of content here"
print(*s_in)

76 111 116 115 32 111 102 32 99 111 110 116 101 110 116 32 104 101 114 101

数字になった。というか、の使い方知らなかった。イテレータを返すのかな?print()出だけ使えるのかな?page = hogeとかやるとエラーになる。

s_in = b"Lots of content here"
print(*s_in)
s_out = gzip.compress(s_in)
print(*s_out)

76 111 116 115 32 111 102 32 99 111 110 116 101 110 116 32 104 101 114 101 31 139 8 0 158 81 118 88 2 255 243 201 47 41 86 200 79 83 72 206 207 43 73 205 43 81 200 72 45 74 5 0 126 117 32 142 20 0 0 0

圧縮したのに数字が増えている。数字が40個あるっぽいから倍になっている。同じ文字というか数字があると圧縮は効いてくるらしい。

s_in = b"aaaaaaaaaaaaaaaaaaaa"
print(*s_in)
s_out = gzip.compress(s_in)
print(*s_out)

97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 31 139 8 0 172 82 118 88 2 255 75 76 196 4 0 206 139 111 38 20 0 0 0

短くなったけどまだ長い。

s_in = b"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
print(*s_in)
s_out = gzip.compress(s_in)
print(*s_out)

97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 9 7 97 97 97 97 97 97 97 97 31 139 8 0 13 83 118 88 2 255 75 76 164 61 0 0 100 122 112 175 100 0 0 0

おー圧縮された。

読み込み

圧縮されたファイルを読み込む例

import gzip
with gzip.open('/home/joe/file.txt.gz', 'rb') as f:
    file_content = f.read()