I believe I'd do something like: #!/usr/local/cpython-3.10/bin/python3
""" Output the last 10 lines of a potentially-huge file. O(n). But technically so is scanning backward from the EOF. It'd be faster to use a dict, but this has the advantage of working for huge num_lines. """ import dbm import os import sys tempfile = f'/tmp/{os.path.basename(sys.argv[0])}.{os.getpid()}' db = dbm.open(tempfile, 'n') num_lines = 10 for cur_lineno, line in enumerate(sys.stdin): db[str(cur_lineno)] = line.encode('utf-8') max_lineno = cur_lineno str_age_out_lineno = str(cur_lineno - num_lines - 1) if str_age_out_lineno in db: del db[str_age_out_lineno] for lineno in range(max_lineno, max_lineno - num_lines, -1): str_lineno = str(lineno) if str_lineno not in db: break print(db[str(lineno)].decode('utf-8'), end='') db.close() os.unlink(tempfile) On Sat, Apr 23, 2022 at 11:36 AM Marco Sulla <marco.sulla.pyt...@gmail.com> wrote: > What about introducing a method for text streams that reads the lines > from the bottom? Java has also a ReversedLinesFileReader with Apache > Commons IO. > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list