It’s that time again; code snippet time. This is a short and sweet bit of a code that has some really practical and powerful implications.
When handling large amounts of data processing, it’s often desirable to keep the user informed of where things are in terms of progress. However, filling up the scrollback buffer with thousands of “Completed processing [item X]” or “X % completed” is not always desirable. So, how do we handle verbosity without filling scrollback?
Here, we will print data using stdout but we will continually use the same line of the terminal. It’s extremely simple; before each data print, we will move the cursor back to the beginning of the current line, cut out the entire line of text, and then print our current bit of data.*Note: This is using ANSI escape sequences and therefore will work on any VT100 type terminal.
import sys class Printer(): """ Print things to stdout on one line dynamically """ def __init__(self,data): sys.stdout.write("\r\x1b[K"+data.__str__()) sys.stdout.flush()
To output data we might do something like:
totalFiles = len(fileList) currentFileNum = 1.0 for f in fileList: ProcessFile(f) currentPercent = currentFileNum/totalFiles*100 output = "%f of %d completed." % (currentPercent,totalFiles) Printer(output) currentFileNum += 1
And here is an example of what our output would look like in a practical scenario.
Simple. You can test it out using an ‘for x in range(1,100)’ sort of statement as well. Now we can keep a persistent display of data processing or program progress without slamming the scrollback buffer of the user’s terminal.