I have searched Google, Stack Overflow and my Python users guide and have not found a simple, workable answer for the question.
I created a file c:\goat.txt on a Windows 7 x64 machine and am attempting to print "test" to the file. I have tried the following based on examples provided on StackOverflow:
At this point I don't want to use the log module since I don't understand from the documentation of to create a simple log based upon a binary condition. Print is simple however how to redirect the output is not obvious.
A simple, clear example that I can enter into my interperter is the most helpful.
Also, any suggestions for informational sites are appreciated (NOT pydocs).
import sys
print('test', file=open('C:\\goat.txt', 'w')) #fails
print(arg, file=open('fname', 'w')) # above based upon this
print>>destination, arg
print>> C:\\goat.txt, "test" # Fails based upon the above
Once you've got Notepad's settings right, try this trick: Open Windows Explorer and right-click a text file. On the context menu that appears, click Print. You no longer need to open Notepad first to tell it your preferences. Notepad remembers them for you.
First, open the text file for write (or append) using the open() function. Second, write to the text file using the write() or writelines() method. Third, close the file using the close() method.
If you're on Python 2.5 or earlier, open the file and then use the file object in your redirection:
log = open("c:\\goat.txt", "w")
print >>log, "test"
If you're on Python 2.6 or 2.7, you can use print as a function:
from __future__ import print_function
log = open("c:\\goat.txt", "w")
print("test", file = log)
log.close()
If you're on Python 3.0 or later, then you can omit the future import.
If you want to globally redirect your print statements, you can set sys.stdout:
import sys
sys.stdout = open("c:\\goat.txt", "w")
print ("test sys.stdout")
To redirect output for all prints, you can do this:
import sys
with open('c:\\goat.txt', 'w') as f:
sys.stdout = f
print "test"
A slightly hackier way (that is different than the answers above, which are all valid) would be to just direct the output into a file via console.
So imagine you had main.py
if True:
print "hello world"
else:
print "goodbye world"
You can do
python main.py >> text.log
and then text.log will get all of the output.
This is handy if you already have a bunch of print statements and don't want to individually change them to print to a specific file. Just do it at the upper level and direct all prints to a file (only drawback is that you can only print to a single destination).
Building on previous answers, I think it's a perfect use case for doing it (simple) context manager style:
import sys
class StdoutRedirection:
"""Standard output redirection context manager"""
def __init__(self, path):
self._path = path
def __enter__(self):
sys.stdout = open(self._path, mode="w")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
sys.stdout.close()
sys.stdout = sys.__stdout__
and then:
with StdoutRedirection("path/to/file"):
print("Hello world")
Also it would be really easy to add some functionality to StdoutRedirection
class (e.g. a method that lets you change the path)
Usinge the file
argument in the print
function, you can have different files per print:
print('Redirect output to file', file=open('/tmp/example.log', 'w'))
o = open('outfile','w')
print('hello world', file=o)
o.close()
I was looking for something like I did in Perl
my $printname = "outfile"
open($ph, '>', $printname)
or die "Could not open file '$printname' $!";
print $ph "hello world\n";
from __future__ import print_function
log = open("s_output.csv", "w",encoding="utf-8")
for i in range(0,10):
print('\nHeadline: '+l1[i], file = log)
Please add encoding="utf-8"
so as to avoid the error of " 'charmap' codec can't encode characters in position 12-32: character maps to "
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With