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) |
解凍後のスクリーンショットはこんな感じだ。
解凍後のサイズが4Gバイト以上のファイルには使えないのが難点だ。
スポンサーリンク
スポンサーリンク