import io
def read_last_line(file, buffer_size=128, nlchar="\n"):
offset = max(file.seek(0, 2) - buffer_size, 0)
file.seek(file.seek(0, 2) - len(nlchar))
while True:
file.seek(offset)
buffer = file.read(buffer_size)
try:
i = buffer.rindex(nlchar)
except ValueError:
if offset == 0:
break
offset = max(offset - buffer_size, 0)
continue
file.seek(offset+i+len(nlchar))
return file.read()
file.seek(0)
return file.read()
tests = [
io.StringIO("single line"),
io.StringIO("line\nlast"),
io.StringIO("line\nlast\n"),
io.StringIO("\n".join(str(n) for n in range(1000))),
]
for i, test in enumerate(tests):
ll1 = test.readlines()[-1]
ll2 = read_last_line(test)
print(f"{i+1:2d}. {ll1!r} {ll2!r} {ll1==ll2}")
aW1wb3J0IGlvCgpkZWYgcmVhZF9sYXN0X2xpbmUoZmlsZSwgYnVmZmVyX3NpemU9MTI4LCBubGNoYXI9IlxuIik6CiAgICBvZmZzZXQgPSBtYXgoZmlsZS5zZWVrKDAsIDIpIC0gYnVmZmVyX3NpemUsIDApCiAgICBmaWxlLnNlZWsoZmlsZS5zZWVrKDAsIDIpIC0gbGVuKG5sY2hhcikpCiAgICAKICAgIHdoaWxlIFRydWU6CiAgICAgICAgZmlsZS5zZWVrKG9mZnNldCkKICAgICAgICBidWZmZXIgPSBmaWxlLnJlYWQoYnVmZmVyX3NpemUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpID0gYnVmZmVyLnJpbmRleChubGNoYXIpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIGlmIG9mZnNldCA9PSAwOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgb2Zmc2V0ID0gbWF4KG9mZnNldCAtIGJ1ZmZlcl9zaXplLCAwKQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGZpbGUuc2VlayhvZmZzZXQraStsZW4obmxjaGFyKSkKICAgICAgICByZXR1cm4gZmlsZS5yZWFkKCkKICAgIGZpbGUuc2VlaygwKQogICAgcmV0dXJuIGZpbGUucmVhZCgpCiAgICAKdGVzdHMgPSBbCglpby5TdHJpbmdJTygic2luZ2xlIGxpbmUiKSwKCWlvLlN0cmluZ0lPKCJsaW5lXG5sYXN0IiksCglpby5TdHJpbmdJTygibGluZVxubGFzdFxuIiksCglpby5TdHJpbmdJTygiXG4iLmpvaW4oc3RyKG4pIGZvciBuIGluIHJhbmdlKDEwMDApKSksCl0KZm9yIGksIHRlc3QgaW4gZW51bWVyYXRlKHRlc3RzKToKCWxsMSA9IHRlc3QucmVhZGxpbmVzKClbLTFdCglsbDIgPSByZWFkX2xhc3RfbGluZSh0ZXN0KQoJcHJpbnQoZiJ7aSsxOjJkfS4ge2xsMSFyfSB7bGwyIXJ9IHtsbDE9PWxsMn0iKQ==