Предположим, у вас есть довольно большой файл (размер исчисляется в гигабайтах). Вы хотите прочесть строку № 120. При этом не хотелось бы загружать в память содержимое файла целиком. То есть, наша задача — прочесть определенную строку текстового файла. Приступим!
Чтобы прочесть определенную строку текстового файла, пройдите следующие шаги:
open()
путь к файлу и режим доступа (для чтения — 'r'
). Режим доступа определяет, что можно будет делать с открытым файлом (читать или записывать в него).open()
, в enumerate(). Эта функция добавляет счетчик к итерируемому объекту и возвращает объект enumerate
. Мы можем использовать этот объект в цикле for для доступа к номерам строк. Примечание: enumerate(file_pointer)
не загружает в память файл целиком, так что это эффективное решение.if
в каждой итерации. При нахождении совпадения сохраните строку в список.У нас есть текстовый файл 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.getline()
. Он принимает в качестве аргументов путь к файлу и номер строки.
Прочтем строку № 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()
.
Вообще Python очень быстро читает файлы, размер которых не превышает несколько Мб.
Метод readlines()
считывает все строки файла и сохраняет их в списке. Далее можно использовать индексацию списка для доступа к кокретной строке (или строкам).
Это самый простой способ прочесть определенную строку файла при помощи Python. Мы считываем весь файл целиком и затем выбираем нужные части.
Давайте прочтем строки с 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
все строки файлового объекта, а добавленное условие поможет отсеять нужные. Обратите внимание, что при таком подходе в память загружается весь файл.
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».
При анализе данных часто требуется быстро найти абсолютное значение набора чисел. Для выполнения этой задачи…
Pydantic - это мощная библиотека проверки данных и управления настройками для Python, созданная для повышения…
Python предлагает набор библиотек, удовлетворяющих различные потребности в визуализации, будь то академические исследования, бизнес-аналитика или…
В Python для представления данных в двоичной форме можно использовать байты. Из этой статьи вы…
В этой статье рассказывается о том, что такое Werkzeug и как Flask использует его для…
При работе с датами часто возникает необходимость прибавлять к дате или вычитать из нее различные…