Something I find annoying about writing a program/script that writes to text files is that you explicitly have to write the linefeeds (things like "\n", "\r", "\r\n" or std::endl). I remember Pascal having something like a
writeln() function, which was very handy when I spend my time programming in TurboPascal, but it's no real incentive at all to return to the "begin...end" mess of Pascal. Apparently java has a
writeln function too.
In Python you have the
write method). That way you can use short, simple and clear
object.write( "wello horld" + "\n") constructs.
The first technique is based on redirecting
sys.stdout by assigning a writable object (such as a file object) to it. The
sys.__stdout__ if you want your default standard output back.
The second technique came to my attention when I reread Learning Python for the second time. It involves redirecting the print statement directly as follows:
print >>output, "wello horld"
output is a writable object.
As an illustration, consider the following script:
#!/usr/bin/python import sys # a simple class with a write method class WritableObject: def __init__(self): self.content =  def write(self, string): self.content.append(string) # example with redirection of sys.stdout foo = WritableObject() # a writable object sys.stdout = foo # redirection print "one, two, three, four" # some writing print "little hat" print "little hat" sys.stdout = sys.__stdout__ # remember to reset sys.stdout! print "foo's content:", foo.content # show the result of the writing # example with redirection of the print statement bar = WritableObject() # another writable object print >>bar, "one, two, three, four" # some (redirected) writing print >>bar, "little hat made of paper" print "bar's content:", bar.content # the result
the output of this script is
foo's content: ['one, two, three, four', '\n', 'little hat', '\n', 'little hat', '\n'] bar's content: ['one, two, three, four', '\n', 'little hat made of paper', '\n']
In a more real life situation (for example with file objects to write to), this can be very handy and keeps you code cleaner and more human readable.