如何从 python 通过管道传输 tar.extractall
How to pipe tar.extractall from python
我正在使用 python 的 tarfile 模块提取 tarball。我不想将提取的文件写入磁盘,而是直接通过管道传输到另一个程序,特别是 bgzip。我也在尝试为此使用 StringIO,但我什至在那个阶段就卡住了——tarball 被提取到磁盘上。
#!/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 的输出?
您不能使用 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 并将 return 一个 类文件对象 .然后,您可以使用 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()
我正在使用 python 的 tarfile 模块提取 tarball。我不想将提取的文件写入磁盘,而是直接通过管道传输到另一个程序,特别是 bgzip。我也在尝试为此使用 StringIO,但我什至在那个阶段就卡住了——tarball 被提取到磁盘上。
#!/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 的输出?
您不能使用 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 并将 return 一个 类文件对象 .然后,您可以使用 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()