我想使用 Python 将打印重定向到 .txt 文件。我有一个循环,当我想将 所有* 输出重定向到一个文件时for,它将print输出我的每个 .bam文件。所以我试着说: *
for
print
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/xxx/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!'
所以有什么问题?除了这个还有什么办法sys.stdout吗?
sys.stdout
我需要我的结果看起来像:
Filename: ERR001268.bam Readlines finished! Mean: 233 SD: 10 Interval is: (213, 252)
最明显的方法是打印到文件对象:
with open('out.txt', 'w') as f: print('Filename:', filename, file=f) #聽Python 3.x print >> f, 'Filename:', filename # Python 2.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()
从 Python 3.4 开始,标准库中有一个简单的上下文管理器可用于执行此操作:
from contextlib import redirect_stdout with open('out.txt', 'w') as f: with redirect_stdout(f): print('data')
从外壳本身外部重定向是另一种选择,通常更可取:
./script.py > out.txt
其他问题:
脚本中的第一个文件名是什么?我没有看到它初始化。
我的第一个猜测是 glob 没有找到任何 bamfile,因此 for 循环不会运行。检查该文件夹是否存在,并在您的脚本中打印出 bamfiles。
此外,使用os.path.join 和 os.path.basename来操作路径和文件名。