Предположим, у вас есть довольно большой файл (размер исчисляется в гигабайтах). Вы хотите прочесть строку № 120. При этом не хотелось бы загружать в память содержимое файла целиком. То есть, наша задача — прочесть определенную строку текстового файла. Приступим!
Содержание
- Чтение конкретных строк файла при помощи 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».