当前位置: 首页 > 面试题库 >

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

俞新翰
2023-03-14
问题内容

我正在从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,也不会令我感到惊讶,但是我没有找到任何建议来仅有效提取一部分存档。

谢谢!


问题答案:

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

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



 类似资料:
  • 问题内容: 我想编写一个存储后端来存储更大的数据块。数据可以是任何东西,但主要是二进制文件(图像,pdf,jar文件)或文本文件(xml,jsp,js,html,java …)。我发现大多数数据已经被压缩。如果所有内容都经过压缩,则可以节省大约15%的磁盘空间。 我正在寻找最高效的算法,该算法可以高概率地预测可以压缩或不压缩(无损压缩)大块数据(假设无损压缩),而不必尽可能查看所有数据。 压缩算法

  • 问题内容: 我想具体说明我的要求。我不要求修改任何MP4文件,只是提取诸如宽度和高度以及比特率和编码之类的元数据,而这不在MP3标签中。 我已经测试了可以工作的Xuggle,但是我需要一个不使用JNI或任何本机代码的库。 我已经研究过MP4Parser和Apache Tika,它们都不提取元数据,而只是标记信息或更改文件。 是否有这样的Java库? 问题答案: 我实际上找到了使用Mp4Parser

  • 问题内容: 我试图仅使用angular命中html形式表单上的“提交”,然后将数据写入json文件。我知道我可以使用angular读取json文件,但不确定是否要创建文件。控制器中的onSubmit(): 的HTML: 不会创建sample_data.json,如果我创建一个空文件,它也不会填充数据。$ scope.model绝对包含数据。如果有人可以提供帮助,将不胜感激。谢谢,阿隆。 问题答案:

  • 问题内容: 我正在使用一些非常沉重的AJAX,其中许多数据都从客户端到服务器。在发送到服务器之前,如何压缩数据(主要是纯文本)? 以及如何在服务器端解压缩数据? 问题答案: jSEND似乎完全可以做到这一点。有人用过吗? 断开的链接已删除:导致垃圾邮件登陆页面@ jsend.org

  • 我做了一个Flink的会话窗口来跟踪访问者在我的网站上的网址。从不活动开始5分钟后结束(会话间隙) Flink是否支持一些API来读取活动窗口中的数据,而无需逐个会话完成?

  • Apache Commons压缩库的重点似乎是编写一个TarchiveOutputStream的TarchiveEntry。但是看起来创建TarArchiveEntry的唯一方法是使用File对象。 有没有什么办法我可以做这样的事情: 或者,更好的....