2017-07-22 34 views
4

私は、それぞれのファイルを50MBずつgzipしたBashでこのbashコマンドを複製しようとしています。これは、15メガバイトにそれぞれgzip圧縮さを返しPythonでgzipファイルを分割したもの

split -b 50m "file.dat.gz" "file.dat.gz.part-" 

import gzip 
infile = "file.dat.gz" 
slice = 50*1024*1024 # 50MB 
with gzip.open(infile, 'rb') as inf: 
    for i, ch in enumerate(iter(lambda: inf.read(slice), "")): 
    print(i, slice) 
    with gzip.open('{}.part-{}'.format(infile[:-3], i), 'wb') as outp: 
     outp.write(ch) 

同等のpythonでの私の試み。私がファイルをgunzipするとき、彼らはそれぞれ50MBです。

gzipファイルをpythonで分割するにはどうすればよいのですか?

答えて

1

splitは、あなたが思うように動作するとは思わない。 gzipファイルをより小さなgzipファイルに分割しません。私。作成した個々のファイルに対してgunzipを呼び出すことはできません。それは文字通りデータを小さな塊に分割し、それをガンゾリしたい場合は最初にすべての塊を連結し直す必要があります。私たちは、より少ないメモリを使用する1つの出力チャンクを作るために複数の小さな入力チャンクを読んだ現実に

infile_name = "file.dat.gz" 

chunk = 50*1024*1024 # 50MB 

with open(infile_name, 'rb') as infile: 
    for n, raw_bytes in enumerate(iter(lambda: infile.read(chunk), b'')): 
     print(n, chunk) 
     with open('{}.part-{}'.format(infile_name[:-3], n), 'wb') as outfile: 
      outfile.write(raw_bytes) 

:だから、Pythonの実際の動作をエミュレートするために、我々のような何かをしたいです。

ファイルを分割して個別に圧縮でき、目標サイズにすることができる場合があります。 bytesIOストリームのようなものを使用して、ファイルをガンジー仕上げし、目的のサイズになるまでそのメモリストリームにgzipして書き出し、書き出して新しいbytesIOストリームを開始することができます。

圧縮データでは、データの圧縮の程度を予測できないため、入力のサイズではなく出力のサイズを測定する必要があります。

関連する問題