title: Get last n lines of a file, similar to tail
body: <p>I'm writing a log file viewer for a web application and for that I want to paginate through the lines of the log file.  The items in the file are line based with the newest item at the bottom.</p>
  <p>So I need a <code>tail()</code> method that can read <code>n</code> lines from the bottom and support an offset.  This is hat I came up with:</p>
  <pre><code>def tail(f, n, offset=0):
      &quot;&quot;&quot;Reads a n lines from f with an offset of offset lines.&quot;&quot;&quot;
      avg_line_length = 74
      to_read = n + offset
      while 1:
          try:
              f.seek(-(avg_line_length * to_read), 2)
          except IOError:
              # woops.  apparently file is smaller than what we want
              # to step back, go to the beginning instead
              f.seek(0)
          pos = f.tell()
          lines = f.read().splitlines()
          if len(lines) &gt;= to_read or pos == 0:
              return lines[-to_read:offset and -offset or None]
          avg_line_length *= 1.3
  </code></pre>
  <p>Is this a reasonable approach?  What is the recommended way to tail log files with offsets?</p>