Python中的Tarfile:我是否可以仅提取一些数据来更有效地解压缩?

问题描述

问题在于tar文件没有中央文件列表,但按顺序存储文件在每个文件之前带有标题tar然后通过gzip将文件压缩以提供给您tar.gz。对于tar文件,如果不想提取某个文件,则只需跳过header->size存档中的下一个字节,然后读取下一个标头。如果归档文件被额外压缩,则您仍将不得不跳过那么多字节,不仅不是在归档文件内,而且还要在解压缩的数据流内对于某些压缩格式有效,而对于另一些格式,则需要跳过这两个字节之间的所有内容)。

gzip属于压缩方案的后一类。因此,尽管您通过不将不需要的文件写入磁盘节省了一些时间,但是您的代码仍将其解压缩。您可以通过重写非gzip存档的_Stream来克服该问题,但是对于您的gz文件,您无能为力。

解决方法

我正在从USGS订购大量的landsat场景,这些场景是tar.gz档案。我正在编写一个简单的python脚本来解压它们。每个档案包含15张tiff图像,大小在60-120
mb之间,总计超过2 gb。我可以使用以下代码轻松提取整个档案:

import tarfile
fileName = "LT50250232011160-SC20140922132408.tar.gz"
tfile = tarfile.open(fileName,'r:gz')
tfile.extractall("newfolder/")

我实际上只需要在标题中标识为“
bands”的15个tiff中的6个。这些是一些较大的文件,因此它们一起占大约一半的数据。因此,我认为可以通过如下修改代码来加快此过程:

fileName = "LT50250232011160-SC20140922132408.tar.gz"
tfile = tarfile.open(fileName,'r:gz')
membersList = tfile.getmembers()
namesList = tfile.getnames()
bandsList = [x for x,y in zip(membersList,namesList) if "band" in y]
print("extracting...")
tfile.extractall("newfolder/",members=bandsList)

但是,在两个脚本中都添加计时器并不会显着提高第二个脚本的效率(在我的系统上,两个脚本都在一个场景中运行约一分钟)。尽管提取速度有所加快,但似乎需要先确定要提取哪些文件的时间,才能抵消增益。

问题是,这种权衡是我在做什么中固有的,还是仅仅是我的代码效率低下的结果?我是python的新手,今天才发现tarfile,所以如果后者是true,也不会令我感到惊讶,但是我没有找到任何建议来仅有效提取一部分存档。

谢谢!