Как перенаправить вывод 'print' в файл, используя python? - PullRequest
137 голосов
/ 22 августа 2011

Я хочу перенаправить печать в файл .txt, используя python.У меня есть цикл for, который будет «печатать» выходные данные для каждого из моих файлов .bam, в то время как я хочу перенаправить ВСЕ эти выходные данные в один файл.Поэтому я попытался поставить

 f = open('output.txt','w'); sys.stdout = f

в начале моего сценария.Однако я ничего не получаю в файле .txt.Мой сценарий:

#!/usr/bin/python

import os,sys
import subprocess
import glob
from os import path

f = open('output.txt','w')
sys.stdout = f

path= '/home/xug/nearline/bamfiles'
bamfiles = glob.glob(path + '/*.bam')

for bamfile in bamfiles:
    filename = bamfile.split('/')[-1]
    print 'Filename:', filename
    samtoolsin = subprocess.Popen(["/share/bin/samtools/samtools","view",bamfile],
                                  stdout=subprocess.PIPE,bufsize=1)
    linelist= samtoolsin.stdout.readlines()
    print 'Readlines finished!'
    ........print....
    ........print....

Так в чем проблема?Любой другой способ кроме этого sys.stdout?

Мне нужен мой результат, похожий на:

Filename: ERR001268.bam
Readlines finished!
Mean: 233
SD: 10
Interval is: (213, 252)

Ответы [ 11 ]

0 голосов
/ 23 августа 2011

Изменение значения sys.stdout меняет назначение всех вызовов для печати. Если вы используете альтернативный способ изменить место назначения печати, вы получите тот же результат.

Ваша ошибка где-то еще:

  • это может быть в коде, который вы удалили для вашего вопроса (откуда берется имя файла для вызова open?)
  • также возможно, что вы не ожидаете сброса данных: если вы печатаете на терминале, данные сбрасываются после каждой новой строки, но если вы печатаете в файл, он сбрасывается только тогда, когда буфер stdout заполнен (4096 байт в большинстве систем).
...