Vous n'aimerez peut-être pas cette réponse, mais je pense que c'est la BONNE. Ne changez pas la destination de votre stdout sauf si c'est absolument nécessaire (peut-être utilisez-vous une bibliothèque qui ne sort que sur stdout ??? clairement pas le cas ici).
Je pense qu'une bonne habitude à prendre est de préparer vos données à l'avance sous forme de chaîne, puis d'ouvrir votre fichier et d'écrire le tout en une seule fois. C'est parce que les opérations d'entrée/sortie sont que plus longtemps vous avez un handle de fichier ouvert, plus il est probable qu'une erreur se produise avec ce fichier (erreur de verrouillage de fichier, erreur d'entrée/sortie, etc). Le fait de tout faire en une seule opération ne laisse aucun doute sur le moment où une erreur a pu se produire.
Voici un exemple :
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')
Puis, lorsque vous avez terminé de collecter vos "lignes de données", une ligne par élément de liste, vous pouvez les joindre à l'aide de la fonction '\n'
pour rendre l'ensemble de l'opération accessible en sortie ; peut-être même que vous pouvez envelopper votre déclaration de sortie dans un fichier with
pour plus de sécurité (il fermera automatiquement votre handle de sortie même si quelque chose ne va pas) :
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!!!"
Cependant si vous avez beaucoup de données à écrire, vous pourrait l'écrire un morceau à la fois. Je ne pense pas que ce soit pertinent pour votre demande mais voici l'alternative :
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()