我遇到的问题是存储文件的名称。存储的文件未使用原始/未压缩文件名命名。相反,存储的文件以存档名称命名(附加" .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"?
答案 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可以存储文件名,但在某些情况下它不能(如果没有原始"文件"只有数据),以及解压缩时是否使用完全是可选的。)