Предположим, у вас есть довольно большой файл (размер исчисляется в гигабайтах). Вы хотите прочесть строку № 120. При этом не хотелось бы загружать в память содержимое файла целиком. То есть, наша задача — прочесть определенную строку текстового файла. Приступим!
Друзья, подписывайтесь на наш телеграм канал Pythonist. Там еще больше туториалов, задач и книг по Python.
Содержание
- Чтение конкретных строк файла при помощи enumerate()
- Как прочесть определенную строку файла при помощи модуля linecache
- Чтение диапазона строк при помощи readlines()
- Генератор для считывания определенной строки файла
- Как прочесть определенную строку файла, перебирая файловый объект в цикле for
Чтение конкретных строк файла при помощи enumerate()
Чтобы прочесть определенную строку текстового файла, пройдите следующие шаги:
- Откройте файл в режиме чтения. Для открытия файла передайте в функцию
open()путь к файлу и режим доступа (для чтения —'r'). Режим доступа определяет, что можно будет делать с открытым файлом (читать или записывать в него). - Создайте список для хранения номеров нужных строк.
- Создайте список для хранения самих строк. Прочитав строки под номерами из первого списка, мы сохраним результат во второй список.
- Используйте цикл for с функцией enumerate(), чтобы получить строку и ее номер. Передайте указатель на файл, возвращенный функцией
open(), в enumerate(). Эта функция добавляет счетчик к итерируемому объекту и возвращает объектenumerate. Мы можем использовать этот объект в цикле for для доступа к номерам строк. Примечание:enumerate(file_pointer)не загружает в память файл целиком, так что это эффективное решение. - Прочтите стоку файла под нужным номером. Для проверки номера строки используйте условие
ifв каждой итерации. При нахождении совпадения сохраните строку в список.
Пример использования enumerate()
У нас есть текстовый файл read_demo.txt со следующим содержимым:
First line Second line Third line Fourth line Fifth line Sixth line Seventh line Eighth line
Давайте прочтем строки 5 и 8.
with open(r"E:\demos\files\read_demo.txt", 'r') as fp:
# lines to read
line_numbers = [4, 7]
# To store lines
lines = []
for i, line in enumerate(fp):
# read line 4 and 7
if i in line_numbers:
lines.append(line.strip())
elif i > 7:
# don't read after line 7 to save time
break
print(lines)
# Вывод:
# ['Fifth line', 'Eighth Line']
Как прочесть определенную строку файла при помощи модуля linecache
Использование linecache — еще один оптимизированный по части производительности способ перепрыгнуть к определенной строке в текстовом файле. Если у вас большой файл, linecache будет хорошим выбором.
Чтобы прочесть определенную строку файла, используйте метод linecache.getline(). Он принимает в качестве аргументов путь к файлу и номер строки.
Примеры использования модуля linecache
Прочтем строку № 5:
import linecache # read fifth line line = linecache.getline(r"E:\demos\files\read_demo.txt", 5) print(line) # Вывод: # Fifth line
Если хотите прочесть больше одной строки, обратите внимание на следующий пример:
import linecache
line_numbers = [2, 4]
lines = []
for i in line_numbers:
x = linecache.getline(r"E:\demos\files\read_demo.txt", i).strip()
lines.append(x)
print(lines)
Чтение диапазона строк при помощи readlines()
Если у вас маленький файл и вы не озабочены производительностью, вам лучше всего подойдет метод readlines().
Вообще Python очень быстро читает файлы, размер которых не превышает несколько Мб.
Метод readlines() считывает все строки файла и сохраняет их в списке. Далее можно использовать индексацию списка для доступа к кокретной строке (или строкам).
Это самый простой способ прочесть определенную строку файла при помощи Python. Мы считываем весь файл целиком и затем выбираем нужные части.
Пример использования readlines()
Давайте прочтем строки с 3 по 5. Не забывайте, что индексация списка начинается с нуля.
with open(r"E:\demos\files\read_demo.txt", 'r') as fp:
# read line number 3 to 5
# index starts from 0
x = fp.readlines()[2:5]
print(x)
А теперь прочтем строку № 8.
with open(r"E:\demos\files\read_demo.txt", 'r') as fp:
# read line 8
x = fp.readlines()[7]
print(x)
Вы также можете использовать метод readline(), чтобы читать файл построчно и остановиться на определенной строке. Используя такой подход, не придется считывать весь файл.
lines = [2, 5]
result = []
i = 0
with open("read_demo.txt", "r+") as fp:
# access each line
while True:
line = fp.readline()
# check line number
if i in lines:
result.append(line.strip())
# line number greater than needed exit the loop
# lines[-1] give last item from list
if i > lines[-1]:
break;
i = i + 1
print(result)
Генератор для считывания определенной строки файла
Генераторное выражение — быстрое и компактное решение для чтения строк файла по номерам.
Если вам нужно извлечь из файла очень много строк, стоит использовать генератор.
Это решение принимает указатель файла и номера строк, которые нужно прочесть. Возвращается объект генератора, который можно проитерировать в цикле для получения каждой строки.
# read by line numbers
def get_lines(fp, line_numbers):
return (x for i, x in enumerate(fp) if i in line_numbers)
with open(r"E:\demos\files\read_demo.txt", 'r') as fp:
# read line 4 and 7
lines = get_lines(fp, [3, 6])
# print each line
for line in lines:
print(line.strip())
# Вывод:
# Fourth line
# Seventh Line
Как прочесть определенную строку файла, перебирая файловый объект в цикле for
Если у вас маленький файл, а производительность не в приоритете, используйте цикл. Можно перебрать в цикле for все строки файлового объекта, а добавленное условие поможет отсеять нужные. Обратите внимание, что при таком подходе в память загружается весь файл.
Пример перебора файлового объекта в цикле
lines = [2, 5]
result = []
i = 0
with open("read_demo.txt", "r+") as fp:
# access each line
for line in fp:
# check line number
if i in lines:
result.append(line.strip())
i = i + 1
print(result)
# Вывод:
# ['Third line', 'Sixth Line']
Заключение
Если файл маленький, используйте readlines() или readline() и цикл для перебора строк в файловом объекте.
В качестве более чистого решения можно предложить linecache. Он хорошо подходит для ситуаций, когда нужно неоднократно считывать одни и те же строки или читать разные строки из нескольких файлов.
Для больших файлов используйте enumerate(), поскольку при таком подходе не нужно загружать в память весь файл.
Перевод статьи «Read Specific Lines From a File in Python».

