Вы можете открыть файл для чтения и прочитать первую строку с использованием встроенного readline()
, а затем найти конец файла и шаг назад, пока не найдете строку EOL и прочитайте последнюю строку оттуда.
with open(file, "rb") as f:
first = f.readline() # Read the first line.
f.seek(-2, os.SEEK_END) # Jump to the second last byte.
while f.read(1) != b"\n": # Until EOL is found...
f.seek(-2, os.SEEK_CUR) # ...jump back the read byte plus one more.
last = f.readline() # Read last line.
Переход к второму последнему байту вместо последнего предотвращает возврат непосредственно из-за конечного EOL. В то время как вы отступаете назад, вам также нужно выполнить два байта, так как чтение и проверка EOL подталкивает позицию вперед на один шаг.
При использовании seek
формат: fseek(offset, whence=0)
, где whence
означает, к чему относится смещение.Цитата docs.python.org:
SEEK_SET
or 0
= seek from the start of the stream (the default); offset must either be a number returned by TextIOBase.tell() , or zero. Any other offset value produces undefined behaviour.
SEEK_CUR
or 1
= “seek” to the current position; offset must be zero, which is a no-operation (all other values are unsupported).
SEEK_END
or 2
= seek to the end of the stream; offset must be zero (all other values are unsupported).
Запуск через раз timeit 10k на файл с 6k линий на общую сумму 200Кб дал мне 1.62s против 6.92s, когда по сравнению с для петли под этим было предложено ранее. Используя файл размером 1,3 ГБ, все еще с 6-килограммовыми линиями, сто раз приводил к 8,93 против 86,95.
with open(file, "rb") as f:
first = f.readline() # Read the first line.
for last in f: pass # Loop through the whole file reading it all.
Пока длина линий не превышает 1024 символов. – FogleBird
Нет гарантий, что строки не длиннее 1024 символов, может быть какой-то другой мусор, кроме временных меток на линии. – pasbino
@pasbino: у вас есть * некоторые * верхняя граница? – SilentGhost