你可能不喜欢这个答案,但我认为这是正确的答案 . 除非绝对必要,否则不要更改你的stdout目的地(也许你正在使用一个只输出到stdout的库?显然不是这里的情况) .
我认为,作为一个好习惯,您应该提前准备数据作为字符串,然后打开您的文件并立即编写整个文件 . 这是因为输入/输出操作是打开文件句柄的时间越长,此文件发生错误的可能性就越大(文件锁定错误,i / o错误等) . 只需在一次操作中完成所有操作就可以确定何时出错 .
这是一个例子:
out_lines = []
for bamfile in bamfiles:
filename = bamfile.split('/')[-1]
out_lines.append('Filename: %s' % filename)
samtoolsin = subprocess.Popen(["/share/bin/samtools/samtools","view",bamfile],
stdout=subprocess.PIPE,bufsize=1)
linelist= samtoolsin.stdout.readlines()
print 'Readlines finished!'
out_lines.extend(linelist)
out_lines.append('\n')
然后当你完成每个列表项的一行收集"data lines"时,你可以用一些 '\n' 字符加入它们,使整个事物可输出;甚至可以将输出语句包装在 with 块中,以增加安全性(即使出现问题也会自动关闭输出句柄):
out_string = '\n'.join(out_lines)
out_filename = 'myfile.txt'
with open(out_filename, 'w') as outf:
outf.write(out_string)
print "YAY MY STDOUT IS UNTAINTED!!!"
但是,如果要写入大量数据,则 could 一次写入一个数据 . 我没有't think it'与您的申请相关,但这里是替代方案:
out_filename = 'myfile.txt'
outf = open(out_filename, 'w')
for bamfile in bamfiles:
filename = bamfile.split('/')[-1]
outf.write('Filename: %s' % filename)
samtoolsin = subprocess.Popen(["/share/bin/samtools/samtools","view",bamfile],
stdout=subprocess.PIPE,bufsize=1)
mydata = samtoolsin.stdout.read()
outf.write(mydata)
outf.close()