如何从python管道tar.extractall

时间:2015-05-27 14:54:47

标签: python stdout tar

我正在使用python的tarfile模块提取tarball。我不希望将提取的文件写在磁盘上,而是直接通过管道传输到另一个程序,特别是bgzip。我也试图使用StringIO,但是我甚至在那个阶段卡住了 - 压缩包被提取到磁盘上。

#!/usr/bin/env python
import tarfile, StringIO
tar = tarfile.open("6genomes.tgz", "r:gz")
def enafun(members):
    for tarkati in tar:
        if tarkati.isreg():
            yield tarkati
reles = StringIO.StringIO()
reles.write(tar.extractall(members=enafun(tar)))
tar.close()

如何正确输出tar.extractall的输出?

1 个答案:

答案 0 :(得分:0)

您不能使用 extractall 方法,但您可以使用 getmembers extractfile 方法:

#!/usr/bin/env python
import tarfile, StringIO
reles = StringIO.StringIO()
with tarfile.open("6genomes.tgz", "r:gz") as tar:
    for m in tar.members():
        if m.isreg():
            reles.write(tar.extractfile(m).read())
# do what you want with "reles".

根据文档,extractfile()方法可以使用 TarInfo 并返回类文件对象。然后,您可以使用read()获取该文件的内容。

[编辑]我添加你在评论中提到的内容,因为评论中的格式似乎无法正确呈现。

#!/usr/bin/env python
import tarfile
import subprocess
with tarfile.open("6genomes.tgz", "r:gz") as tar:
    for m in tar.members():
        if m.isreg():
            f = tar.extractfile(m)
            new_filename = generate_new_filename(f.name)
            with open(new_filename, 'wb') as new_file:
                proc = subprocess.Popen(['bgzip', '-c'], stdin=subprocess.PIPE, stdout=new_file)
                proc.stdin.write(f.read())
                proc.stdin.close()
                proc.wait()
            f.close()