Python: как прочитать файл построчно (и большой файл тоже)
Самый надёжный способ прочитать файл построчно в Python: открыть его через with open(путь, encoding="utf-8") as f и перебрать for line in f. Файл читается лениво, строка за строкой, поэтому так можно обработать файл любого размера.
Прочитать файл построчно
lines = ["первая строка", "вторая строка", "", "четвёртая строка"]
with open("notes.txt", "w", encoding="utf-8") as f:
f.write("\n".join(lines) + "\n")
with open("notes.txt", encoding="utf-8") as f:
for line in f:
print(repr(line))Каждая строка содержит символ конца строки \n. Уберите его вместе с пробелами по краям методом rstrip() или strip():
with open("notes.txt", encoding="utf-8") as f:
clean = [line.rstrip("\n") for line in f]
print(clean) # ['первая строка', 'вторая строка', '', 'четвёртая строка']С номерами строк и пропуском пустых
with open("notes.txt", encoding="utf-8") as f:
for number, line in enumerate(f, start=1):
text = line.strip()
if not text:
continue
print(number, text)Всё содержимое сразу
Для небольших файлов удобны три способа:
with open("notes.txt", encoding="utf-8") as f:
everything = f.read() # одна строка
with open("notes.txt", encoding="utf-8") as f:
as_list = f.readlines() # список строк с символами \n
print(len(everything.splitlines())) # 4
print(len(as_list)) # 4Через pathlib
from pathlib import Path
rows = Path("notes.txt").read_text(encoding="utf-8").splitlines()
print(rows[0]) # первая строкаМетод splitlines() убирает символы конца строки сам. Файл при этом читается целиком, поэтому для больших данных этот вариант не подходит.
Большой файл: по частям и с фильтром
def lines_with(path, word):
"""Лениво отдаёт строки, содержащие слово, не загружая файл в память."""
with open(path, encoding="utf-8") as f:
for line in f:
if word in line:
yield line.rstrip("\n")
print(list(lines_with("notes.txt", "строка"))) # ['первая строка', 'вторая строка', 'четвёртая строка']Кодировка
Ситуация | Что указать |
|---|---|
Файл в UTF-8 |
|
Файл из Excel с BOM |
|
Старый файл Windows |
|
Не уверены, а потерять данные нельзя |
|
Частые вопросы
Почему после for line in f пустая строка в конце?
Это не пустая строка, а символ \n в конце каждой строки. Он остаётся в тексте, пока вы не уберёте его через rstrip("\n").
Чем readlines отличается от перебора файла?
readlines() сразу загружает весь файл в список. Цикл for line in f читает по одной строке и экономит память.