fork download
  1. import io
  2.  
  3. def read_last_line(file, buffer_size=128, nlchar="\n"):
  4. offset = max(file.seek(0, 2) - buffer_size, 0)
  5. file.seek(file.seek(0, 2) - len(nlchar))
  6.  
  7. while True:
  8. file.seek(offset)
  9. buffer = file.read(buffer_size)
  10. try:
  11. i = buffer.rindex(nlchar)
  12. except ValueError:
  13. if offset == 0:
  14. break
  15. offset = max(offset - buffer_size, 0)
  16. continue
  17. file.seek(offset+i+len(nlchar))
  18. return file.read()
  19. file.seek(0)
  20. return file.read()
  21.  
  22. tests = [
  23. io.StringIO("single line"),
  24. io.StringIO("line\nlast"),
  25. io.StringIO("line\nlast\n"),
  26. io.StringIO("\n".join(str(n) for n in range(1000))),
  27. ]
  28. for i, test in enumerate(tests):
  29. ll1 = test.readlines()[-1]
  30. ll2 = read_last_line(test)
  31. print(f"{i+1:2d}. {ll1!r} {ll2!r} {ll1==ll2}")
Success #stdin #stdout 0.08s 14064KB
stdin
Standard input is empty
stdout
 1. 'single line' 'single line' True
 2. 'last' 'last' True
 3. 'last\n' '' False
 4. '999' '999' True