擅长:python、mysql、java
<p>问题是<code>tar</code>文件没有中央文件列表,而是在每个文件之前按<a href="http://www.gnu.org/software/tar/manual/html_node/Standard.html" rel="nofollow noreferrer">a header</a>顺序存储文件。然后通过gzip压缩<code>tar</code>文件,得到<code>tar.gz</code>。对于<code>tar</code>文件,如果不想提取某个文件,只需跳过存档文件中的下一个<code>header->size</code>字节,然后读取下一个头。如果存档文件被额外压缩,那么您仍然需要跳过这么多字节,不仅是在存档文件中,而且是在解压缩的数据流中,即<a href="https://stackoverflow.com/questions/429987/compression-formats-with-good-support-for-random-access-within-archives">for some compression formats works, but for others requires you to decompress everything in between</a>。</p>
<p>gzip属于后一类压缩方案。因此,虽然不将不需要的文件写入磁盘可以节省一些时间,但代码仍然会对它们进行解压缩。您可以通过重写非gzip存档的<a href="https://github.com/python/cpython/blob/master/Lib/tarfile.py#L326" rel="nofollow noreferrer">^{<cd6>} class</a>来解决这个问题,但是对于您的<code>gz</code>文件,您无能为力。</p>