如何使用python将“打印”输出重定向到文件?

发布于 2021-02-02 23:13:25

我想使用python将打印重定向到.txt文件。我有一个“ 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)
关注者
0
被浏览
107
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    最明显的方法是打印到文件对象:

    with open('out.txt', 'w') as f:
        print >> f, 'Filename:', filename     # Python 2.x
        print('Filename:', filename, file=f)  # Python 3.x
    

    但是,重定向标准输出对我也有效。像这样的一次性脚本可能很好:

    import sys
    
    orig_stdout = sys.stdout
    f = open('out.txt', 'w')
    sys.stdout = f
    
    for i in range(2):
        print 'i = ', i
    
    sys.stdout = orig_stdout
    f.close()
    

    从外壳本身进行外部重定向是另一个不错的选择:

    ./script.py > out.txt
    

    其他问题:

    脚本中的第一个文件名是什么?我看不到它已初始化。

    我的第一个猜测是glob找不到任何bamfile,因此for循环不会运行。检查文件夹是否存在,并在脚本中打印出bamfiles。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看