如何在Python中压缩大文件?

Jak*_*ake 5 python compression gzip

我遇到的问题是存储文件的名称。存储的文件未使用原始/未压缩的文件名命名。而是使用存档名称(带有扩展名“ .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)
Run Code Online (Sandbox Code Playgroud)

我如何获得存档来存储名称为“ file.txt”而不是“ file.txt.gz”的文件?

Rob*_*obᵩ 6

你必须使用gzip.GzipFile(); 速记gzip.open()不会做你想要的。

引用文档

fileobj不是 时Nonefilename参数仅用于包含在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)
Run Code Online (Sandbox Code Playgroud)


spo*_*key -1

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

当您存储“gzip”文件时,它(不一定)记住原始文件名。只有原始文件的压缩内容,您可以随意命名。按照惯例,它的名称与原始文件相同,但附加“.gz”。如果您只提供文件名,Unix 系统上的“gzip”和“gunzip”实用程序将假定这一点:

gzip foo.txt
# now foo.txt has been deleted, and foo.txt.gz exists
gunzip foo.txt.gz
# now you have foo.txt back, and foo.txt.gz has been deleted.
Run Code Online (Sandbox Code Playgroud)

如果您将 foo.txt.gz 重命名为 bar.txt.gz,然后使用gunzip,如果您使用 Unixgunzip,您将得到“goo.txt”(但其他实用程序可能会做不同的事情)。

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

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