Если вы не хотите читать весь файл, вы можете искать его в середине файла, затем искать назад для новой строки и вызывать readline
.
Вот Python3 скрипт, который делает именно это,
. Одним из недостатков этого метода является то, что короткие линии имеют более низкое вероятность появления.
def read_random_line(f, chunk_size=16):
import os
import random
with open(f, 'rb') as f_handle:
f_handle.seek(0, os.SEEK_END)
size = f_handle.tell()
i = random.randint(0, size)
while True:
i -= chunk_size
if i < 0:
chunk_size += i
i = 0
f_handle.seek(i, os.SEEK_SET)
chunk = f_handle.read(chunk_size)
i_newline = chunk.rfind(b'\n')
if i_newline != -1:
i += i_newline + 1
break
if i == 0:
break
f_handle.seek(i, os.SEEK_SET)
return f_handle.readline()