Первое, о чем вы должны подумать, столкнувшись с такой проблемой, - это избегать одновременного считывания всего файла в память.readlines()
сделает это, так что конкретного метода следует избегать.
К счастью, у нас есть отличная стандартная библиотека на Python, itertools
.itertools
имеет множество полезных функций, и одна из них - islice
.islice
перебирает итерируемое (например, списки, генераторы, файловые объекты и т. Д.) И возвращает генератор, содержащий указанный диапазон:
itertools.islice(iterable, start, stop[, step])
Сделать итератор, который возвращает выбранные элементы из итерируемого.Если start не равен нулю, то элементы из итерируемого пропускаются до тех пор, пока не будет достигнут старт.После этого элементы возвращаются последовательно, если только для шага не установлено больше единицы, что приводит к пропуску элементов.Если stop равен None, итерация продолжается до тех пор, пока итератор не будет исчерпан;в противном случае он останавливается в указанной позиции.В отличие от обычной нарезки, islice () не поддерживает отрицательные значения для начала, остановки или шага.Может использоваться для извлечения связанных полей из данных, где внутренняя структура была сглажена (например, многострочный отчет может содержать поле имени в каждой третьей строке)
Использование этой информациивместе с методом str.join вы можете, например, извлечь строки 10-19 с помощью этого простого кода:
from itertools import islice
# Add the 'wb' flag if you use Windows
with open('huge_data_file.txt', 'wb') as data_file:
txt = '\n'.join(islice(data_file, 10, 20))
Обратите внимание, что при циклическом перемещении по объекту файла символ новой строкиубирается из линий, поэтому вам нужно установить \ n в качестве присоединяемого символа.