[Python-3000] Reversing through text files with the new IO library (original) (raw)

Mark Russell mark.russell at zen.co.uk
Sat Mar 10 15:22:52 CET 2007


As an experiment with the new IO library (http://docs.google.com/Doc? id=dfksfvqd_1cn5g5m), I added support for walking through the lines
of a file backwards using the reversed() iterator:

 for line in reversed(open(path)):
      ...

It works by scanning backwards through the file a block at a time
(using seek()) but will handle arbitrary length lines.

The patch is at http://www.python.org/sf/1677872. The code is
currently directly in Lib/io.py, but in fact the only internal access
it needs is adding the reversed hook to TextIOWrapper.

It's useful for scanning backwards through large log files, but it's
also IMHO a nice example of the benefits of the new library. The
version of this that I used under python 2.5 had to use os.seek() etc
on file descriptors, whereas now it just wraps a new buffering class
(io.TextLineReverser) around the raw IO object. Among other things
it makes unit tests simpler - instead of messing around with
temporary files the tests can do things like:

 b = io.BytesIO(b'one\ntwo\nthree\n')
 assert list(io.TextLineReverser(b)) == [ 'three\n', 'two\n', 'one 

\n' ]

Mark Russell



More information about the Python-3000 mailing list