我正在尝试在 Bash 中复制这个 bash 命令,它返回每个压缩 50MB 的文件。
split -b 50m "file.dat.gz" "file.dat.gz.part-"
我对 python 等价物的尝试
import gzip
infile_name = "file.dat.gz"
chunk = 50*1024*1024 # 50MB
with gzip.open(infile_name, 'rb') as infile:
for n, raw_bytes in enumerate(iter(lambda: infile.read(slice), '')):
print(n, chunk)
with gzip.open('{}.part-{}'.format(infile_name[:-3], n), 'wb') as outfile:
outfile.write(raw_bytes)
每个 gzip 后返回 15MB。当我 gunzip 文件时,它们每个都是 50MB。
我如何在 python 中拆分 gzip 文件,以便在 gunzip 之前拆分文件每个 50MB?
最佳答案
我不相信 split
会像您认为的那样工作。它不会将 gzip 文件拆分为更小的 gzip 文件。 IE。您不能对它创建的单个文件调用 gunzip。它实际上将数据分解成更小的 block ,如果你想压缩它,你必须先将所有 block 连接在一起。所以,为了用 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)
实际上,我们会读取多个较小的输入 block ,以使一个输出 block 使用更少的内存。
我们或许可以将文件分解成更小的文件,我们可以单独对其进行压缩,并且仍然可以达到我们的目标大小。使用类似 bytesIO
流的东西,我们可以将文件 gunzip 并将其 gzip 到该内存流中,直到它达到目标大小,然后将其写出并启动一个新的 bytesIO
流。
对于压缩数据,您必须测量输出的大小,而不是输入的大小,因为我们无法预测数据的压缩程度。
关于python - 在 python 中拆分相当于 gzip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45250329/