<p>通过将tarfile作为流打开,可以更有效地执行此操作。(<a href="https://docs.python.org/2/library/tarfile.html#tarfile.open" rel="noreferrer">https://docs.python.org/2/library/tarfile.html#tarfile.open</a>)</p>
<pre><code>mkdir tartest
cd tartest/
dd if=/dev/urandom of=file1 count=100 bs=1M
dd if=/dev/urandom of=file2 count=100 bs=1M
dd if=/dev/urandom of=file3 count=100 bs=1M
dd if=/dev/urandom of=file4 count=100 bs=1M
dd if=/dev/urandom of=file5 count=100 bs=1M
cd ..
tar czvf test.tgz tartest
</code></pre>
<p>现在这样读:</p>
<pre><code>import tarfile
fileName = "test.tgz"
tfile = tarfile.open(fileName, 'r|gz')
for t in tfile:
if "file3" in t.name:
f = tfile.extractfile(t)
if f:
print(len(f.read()))
</code></pre>
<p>注意open命令中的<code>|</code>。我们只读了<code>file3</code>。</p>
<pre><code>$ time python test.py
104857600
real 0m1.201s
user 0m0.820s
sys 0m0.377s
</code></pre>
<p>如果我把<code>r|gz</code>改回<code>r:gz</code>,我得到:</p>
<pre><code>$ time python test.py
104857600
real 0m7.033s
user 0m6.293s
sys 0m0.730s
</code></pre>
<p>大约快5倍(因为我们有5个大小相同的文件)。这是因为标准的打开方式允许向后搜索;它只能在压缩的tar文件中通过提取(我不知道确切的原因)。如果你以流的形式打开,你就不能再随机搜索了,但是如果你按顺序阅读,这在你的情况下是可能的,它会快得多。但是,您不能再提前到<code>getnames</code>。但在这种情况下这是不必要的。</p>