Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

printing to a file in Python: redirect vs print's file argument vs write

I have a bunch of print calls that I need to write to a file instead of stdout. (I don't need stdout at all.)

I am considering three approaches. Are there any advantages (including performance) to any one of them?

Full redirect, which I saw here:

import sys

saveout = sys.stdout
fsock = open('out.log', 'w')
sys.stdout = fsock

print(x)
# and many more print calls

# later if I ever need it:
# sys.stdout = saveout
# fsock.close()

Redirect in each print statement:

fsock = open('out.log', 'w')
print(x, file = fsock)
# and many more print calls

Write function:

fsock = open('out.log', 'w')
fsock.write(str(x))
# and many more write calls
like image 933
max Avatar asked Nov 03 '10 19:11

max


People also ask

What is the difference between write and print in Python?

The "Write" statement will put "" around the data you are outputting and the "Print" statement will not. The "Print" statement will also output data to the screen as well as an open file, where the "Write" statement only outputs to an open file.

What is the correct way to print in Python?

Python print() Function The print() function prints the specified message to the screen, or other standard output device. The message can be a string, or any other object, the object will be converted into a string before written to the screen.

What is file argument in print Python?

file parameter of Python's print() Function print() function in Python3 supports a 'file' argument, which specifies where the function should write a given object(s) to. If not specified explicitly, it is sys. stdout by default. It serves two essential purposes: Print to STDERR Print to external file.

Is print an argument in Python?

Python print() Function Parameters. There seem to be 5 arguments that the print() function accepts. This may cause some confusion, so let me show you how what each of these arguments does, and when they are useful.


1 Answers

I would not expect any durable performance differences among these approaches.

The advantage of the first approach is that any reasonably well-behaved code which you rely upon (modules you import) will automatically pick up your desired redirection.

The second approach has no advantage. It's only suitable for debugging or throwaway code ... and not even a good idea for that. You want your output decisions to be consolidated in a few well-defined places, not scattered across your code in every call to print(). In Python3 print() is a function rather than a statement. This allows you to re-define it, if you like. So you can def print(*args) if you want. You can also call __builtins__.print() if you need access to it, within the definition of your own custom print(), for example.

The third approach ... and by extension the principle that all of your output should be generated in specific functions and class methods that you define for that purpose ... is probably best.

You should keep your output and formatting separated from your core functionality as much as possible. By keeping them separate you allow your core to be re-used. (For example you might start with something that's intended to run from a text/shell console, and later need to provide a Web UI, a full-screen (curses) front end or a GUI for it. You may also build entirely different functionality around it ... in situations where the resulting data needs to be returned in its native form (as objects) rather than pulled in as text (output) and re-parsed into new objects.

For example I've had more than one occasional where something I wrote to perform some complex queries and data gathering from various sources and print a report ... say of the discrepancies ... later need to be adapted into a form which could spit out the data in some form (such as YAML/JSON) that could be fed into some other system (say, for reconciling one data source against another.

If, from the outset, you keep the main operations separate from the output and formatting then this sort of adaptation is relatively easy. Otherwise it entails quite a bit of refactoring (sometimes tantamount to a complete re-write).

like image 77
Jim Dennis Avatar answered Sep 19 '22 10:09

Jim Dennis