Предположим, у вас есть довольно большой файл (размер исчисляется в гигабайтах). Вы хотите прочесть строку № 120. При этом не хотелось бы загружать в память содержимое файла целиком. То есть, наша задача — прочесть определенную строку текстового файла. Приступим!
Друзья, подписывайтесь на наш телеграм канал Pythonist. Там еще больше туториалов, задач и книг по Python.
Чтобы прочесть определенную строку текстового файла, пройдите следующие шаги:
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».
Если вы ищете работу на Python, на Talanto.work сейчас есть варианты для junior, middle, senior…
Рынок Python-вакансий большой, но удобным его назвать сложно. Формально вакансий много, однако в реальном поиске…
Срезы в Python — это больше, чем a[2:7]. В статье — быстрый разбор полезных приёмов:…
В этой статье мы рассмотрим возведение в степень в Python с помощью различных методов, от…
Дубликаты в списке Python — частая проблема. В статье показано, как быстро убрать повторы, в…
Услуга виртуального хостинга на SpaceWeb позволяет арендовать часть сервера (shared-сервера) и разместить на нём свой…