在Python中分割相当于gzip文件

问题描述:

我想在Bash中复制这个bash命令,它返回每个文件gzip每个50MB。在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) 

这将返回15MB每个gzip压缩的尝试。当我对这些文件进行压缩时,它们每个都是50MB。

如何分割python中的gzip文件,以便在gunzipping之前每个文件分割为50MB?

我不认为split按照您认为的方式工作。它不会将gzip文件分割成更小的gzip文件。即你不能对它创建的单个文件调用gunzip。它实际上将数据分解为更小的块,如果你想对它进行gunzip,你必须首先将所有块重新拼接在一起。因此,要模拟与Python的实际行为,我们会做一些事情,如:

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) 

在现实中,我们读到多个较小的输入块,使一个输出大块使用较少的内存。

我们可能会将文件分割成更小的文件,我们可以单独进行gunzip,并且仍然可以制作目标大小。使用类似bytesIO流的东西,我们可以对该文件进行gunzip压缩,然后将其压缩到该内存流中,直到达到目标大小,然后将其写出并开始新的bytesIO流。

对于压缩数据,您必须测量输出的大小,而不是输入的大小,因为我们无法预测数据的压缩程度。