Как прочесть определенную строку файла при помощи Python

Предположим, у вас есть довольно большой файл (размер исчисляется в гигабайтах). Вы хотите прочесть строку № 120. При этом не хотелось бы загружать в память содержимое файла целиком. То есть, наша задача — прочесть определенную строку текстового файла. Приступим!

Содержание

Чтение конкретных строк файла при помощи enumerate()

Чтобы прочесть определенную строку текстового файла, пройдите следующие шаги:

  1. Откройте файл в режиме чтения. Для открытия файла передайте в функцию open() путь к файлу и режим доступа (для чтения — 'r'). Режим доступа определяет, что можно будет делать с открытым файлом (читать или записывать в него).
  2. Создайте список для хранения номеров нужных строк.
  3. Создайте список для хранения самих строк. Прочитав строки под номерами из первого списка, мы сохраним результат во второй список.
  4. Используйте цикл for с функцией enumerate(), чтобы получить строку и ее номер. Передайте указатель на файл, возвращенный функцией open(), в enumerate(). Эта функция добавляет счетчик к итерируемому объекту и возвращает объект enumerate. Мы можем использовать этот объект в цикле for для доступа к номерам строк. Примечание: enumerate(file_pointer) не загружает в память файл целиком, так что это эффективное решение.
  5. Прочтите стоку файла под нужным номером. Для проверки номера строки используйте условие 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».