Question

Suppose I am writing stdout to a file, like this:

sys.stdout = open("file.txt", "w")
# print stuff here

Doing this doesn't work:

sys.stdout.close()

How can I close a file after writing stdout to it?

Was it helpful?

Solution

I took your question to mean: "How can I redirect sys.stdout to a file?"

import sys

# we need this to restore our sys.stdout later on
org_stdout = sys.stdout

# we open a file
f = open("test.txt", "w")
# we redirect standard out to the file
sys.stdout = f
# now everything that would normally go to stdout
# now will be written to "test.txt"
print "Hello world!\n"
# we have no output because our print statement is redirected to "test.txt"!
# now we redirect the original stdout to sys.stdout
# to make our program behave normal again
sys.stdout = org_stdout
# we close the file
f.close()
print "Now this prints to the screen again!"
# output "Now this prints to the screen again!"

# we check our file
with open("test.txt") as f:
    print f.read()
# output: Hello World!

Is this an answer to your question?

OTHER TIPS

You can also do this if you want to redirect all print() to a file, which is a fast way and also usefull by my opinion but it could have other effects. If I'm wrong please correct me.

import sys

stdoutold = sys.stdout
sys.stdout = fd = open('/path/to/file.txt','w')
# From here every print will be redirected to the file
sys.stdout = stdoutold
fd.close()
# From here every print will be redirected to console

You can do this:

import sys

class writer(object):
    """ Writes to a file """

    def __init__(self, file_name):
        self.output_file = file_name

    def write(self, something):
        with open(self.output_file, "a") as f:
            f.write(something)

if __name__ == "__main__":
    stdout_to_file = writer("out.txt")
    sys.stdout = stdout_to_file
    print "noel rocks"

The file is only open when you write to it like this.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top