Pythonプログラミング:gzip解凍進行状況をtqdmで視覚化する

4G以上のgzipファイルは解凍するまでファイルサイズは分からないらしいので、下記の方法は4G未満のファイルにしか使えない。

gzipファイルの解凍後のサイズはアーカイブの最後の方の4バイトに書かれているので、以下のようにここを読み出すことで、解凍後のtotal_sizeサイズを得ることができる。

1
2
3
4
5
6
fname = "enwiki-latest-abstract10.xml.gz"
f= open(fname, 'rb')
f.seek(-4, 2)
r=f.read()
f.close()
total_size = struct.unpack('<I', r)[0]

progress barは前回同様、以下のようにしてtqdmを使えば簡単に作れる

pbar = tqdm(total=total_size, unit='B', unit_scale=True, unit_divisor=1024)

後はgzip moduleでファイルを読み出して別ファイルに書き込めばgzipを解凍できる。
最終的なコードは、不格好ながら、以下のような簡単なものに仕上がる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from tqdm import tqdm
import struct
import gzip
import os.path
fname = "enwiki-latest-abstract10.xml.gz"
f= open(fname, 'rb')
f.seek(-4, 2)
r=f.read()
f.close()
total_size = struct.unpack('<I', r)[0]
store_path = os.path.splitext(fname)[0]
pbar = tqdm(total=total_size, unit='B', unit_scale=True, unit_divisor=1024)
fr = gzip.open(fname, 'rb')
with open(store_path, 'wb') as fw:
        for d in fr:
            w = fw.write(d)
            pbar.update(w)

解凍後のスクリーンショットはこんな感じだ。
gzip-tqdm-progress-bar
解凍後のサイズが4Gバイト以上のファイルには使えないのが難点だ。

参考サイトhttps://stackoverflow.com/

スポンサーリンク