python - 在 python 中拆分相当于 gzip 文件

标签 python split gzip

我正在尝试在 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/

相关文章:

python - 如何更改 Pandas 中多列的数据类型

python - BasicRNNCell 中如何确定单元状态大小和单元输出大小?

express - webpack gzip 与 Express gzip

c# - 使用 gzip 压缩 HttpWebRequest

python - scipy.optimize.minimize 忽略约束

python - 绘制多轴对象数组

javascript - 如何在node.js上拆分参数而不为默认搜索创建错误

css - 使用 String.split inline 在 View 中设置 CSS 类

java - 字符串拆分两次后如何返回String[][]?

javascript - 网站无法在 IE 中加载