如何在Python中压缩大文件?

时间:2016-06-24 16:27:16

标签: python compression gz

我遇到的问题是存储文件的名称。存储的文件未使用原始/未压缩文件名命名。相反,存储的文件以存档名称命名(附加" .gz"扩展名)。

预期结果:
file.txt.gz {存档名称}
.... file.txt {存储文件名}

实际结果:
file.txt.gz {存档名称}
.... file.txt.gz {存储文件名}

阅读gzip文档(https://docs.python.org/2.7/library/gzip.html)示例代码:

import gzip
import shutil
with open('file.txt', 'rb') as f_in, gzip.open('file.txt.gz', 'wb') as f_out:
    shutil.copyfileobj(f_in, f_out)

如何获取存档以存储名称为" file.txt"的文件。而不是" file.txt.gz"?

2 个答案:

答案 0 :(得分:1)

你必须使用gzip.GzipFile();简写gzip.open()不会做你想做的事。

Quoth the doc

  

fileobj 不是None时, filename 参数仅用于包含在 gzip 文件头中,可以包括未压缩文件的原始文件名。如果可以辨别,它默认为 fileobj 的文件名;否则,它默认为空字符串,在这种情况下,原始文件名不包含在标题中。

试试这个:

import gzip
import shutil
with open('file.txt', 'rb') as f_in:
    with open('file.txt.gz', 'wb') as f_out:
        with gzip.GzipFile('file.txt', 'wb', fileobj=f_out) as f_out:
            shutil.copyfileobj(f_in, f_out)

答案 1 :(得分:-1)

您正在区分'存储的文件名'并且'归档名称',但对于gzip压缩,这是错误的思考方式,因为gzip不是归档格式,而只是压缩协议。

当你存储一个' gzip'文件,它(不一定)记住原始文件名。只有原始文件的压缩内容,您可以给出任何您想要的名称。有一个约定,它给它与原始文件相同的名称,但使用" .gz"追加。 " gzip"和#34; gunzip"如果您只提供文件名,Unix系统上的实用程序将采用此方法:

area

如果你将foo.txt.gz重命名为bar.txt.gz,然后将其重命名为gunzip,那么你将获得' goo.txt'如果您使用Unix gunzip(但其他实用程序可能会做一些不同的事情)。

但是,您可以在流模式下使用gzip和gunzip,在这种情况下,他们对文件名一无所知 - gzip实际上是关于压缩,并不关心文件名。

(编辑:gzip可以存储文件名,但在某些情况下它不能(如果没有原始"文件"只有数据),以及解压缩时是否使用完全是可选的。)