["python","io","file-writing"]
How to redirect 'print' output to a file?

I want to redirect the print to a .txt file using Python. I have a for loop, which will print the output for each of my .bam file while I want to redirect all output to one file. So I tried to put: f = open('output.txt','w') sys.stdout = f at the beginning of my script. However I get nothing in the .txt file. My script is: #!/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!' So what's the problem? Any other way besides this sys.stdout? I need my result look like: Filename: ERR001268.bam Readlines finished! Mean: 233 SD: 10 Interval is: (213, 252)
The most obvious way to do this would be to print to a file object: with open('out.txt', 'w') as f: print('Filename:', filename, file=f) # Python 3.x # print >> f, 'Filename:', filename # Python 2.x However, redirecting stdout also works for me. It is probably fine for a one-off script such as this: 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() Since Python 3.4 there's a simple context manager available to do this in the standard library: from contextlib import redirect_stdout with open('out.txt', 'w') as f: with redirect_stdout(f): print('data') Redirecting externally from the shell itself is another option, and often preferable: ./script.py > out.txt Other questions: What is the first filename in your script? I don't see it initialized. My first guess is that glob doesn't find any bamfiles, and therefore the for loop doesn't run. Check that the folder exists, and print out bamfiles in your script. Also, use os.path.join and os.path.basename to manipulate paths and filenames.