在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
流。
对于压缩数据,您必须测量输出的大小,而不是输入的大小,因为我们无法预测数据的压缩程度。