Чтение и запись текстовых файлов
Чтение и запись текстовых файлов
До сих пор программы «забывали» все данные при завершении. Чтобы сохранить результат между запусками, нужны файлы. Python предоставляет простой встроенный API для работы с текстовыми файлами — без сторонних библиотек.
Открытие файла: open()
Функция open() открывает файл и возвращает файловый объект:
f = open("notes.txt", "w", encoding="utf-8")
f.write("Привет, файл!")
f.close()
Параметры open():
- первый аргумент — путь к файлу
- второй — режим:
"r"(чтение),"w"(запись, перезаписывает),"a"(дозапись),"x"(создание, ошибка если существует) encoding— кодировка; всегда указывайте"utf-8"явно
Режимы открытия
| Режим | Описание |
|---|---|
"r" | Чтение (по умолчанию). Ошибка если файл не существует |
"w" | Запись. Создаёт файл или перезаписывает существующий |
"a" | Дозапись в конец. Создаёт если не существует |
"x" | Создание нового. FileExistsError если уже есть |
"r+" | Чтение и запись |
Запись в файл
f = open("output.txt", "w", encoding="utf-8")
f.write("Первая строка\n")
f.write("Вторая строка\n")
f.close() # ВАЖНО: закрыть файл
Вызов close() обязателен — он сбрасывает буфер на диск. Если забыть, данные могут не записаться. Для нескольких строк удобнее writelines():
lines = ["строка 1\n", "строка 2\n", "строка 3\n"]
f = open("output.txt", "w", encoding="utf-8")
f.writelines(lines)
f.close()
Чтение из файла
Три способа прочитать содержимое:
f = open("output.txt", "r", encoding="utf-8")
# read() — весь файл как одна строка:
content = f.read()
print(content)
f.close()
f = open("output.txt", "r", encoding="utf-8")
# readline() — одну строку за раз:
line1 = f.readline()
line2 = f.readline()
f.close()
f = open("output.txt", "r", encoding="utf-8")
# readlines() — список всех строк (со \n):
lines = f.readlines()
for line in lines:
print(line.strip()) # strip() убирает \n
f.close()
Для большинства задач удобнее всего итерировать файловый объект напрямую — построчно, без загрузки всего файла в память:
f = open("big_file.txt", "r", encoding="utf-8")
for line in f:
process(line.strip())
f.close()
Дозапись: режим "a"
f = open("log.txt", "a", encoding="utf-8")
f.write("Новая запись\n")
f.close()
Режим "a" не стирает существующее содержимое — добавляет в конец. Полезен для логов и накопления данных.
Опасность забытого close()
Если программа завершится с ошибкой между open() и close(), файл может не закрыться — данные потеряются, а ресурсы ОС не освободятся. Решение — with open(...), которое гарантирует закрытие в любом случае. Подробно об этом — в следующем уроке.
Проверь себя
Какой режим открытия нужен, чтобы прочитать файл и получить ошибку, если файл не существует?
Режим "r" (по умолчанию) — открывает для чтения и выбрасывает FileNotFoundError, если файл не существует.
Итог
open(path, mode, encoding="utf-8")— открыть файл; всегда указывайтеencoding.- Режимы:
"r"— чтение,"w"— запись (перезаписывает),"a"— дозапись. f.read()— всё;f.readline()— строка;f.readlines()— список строк; итерация поf— построчно.f.write(text)— записать строку;f.writelines(list)— список строк.f.close()обязателен — или используйтеwith open(...)(следующий урок).
В следующем уроке изучим контекстный менеджер with open — более безопасный и удобный способ работы с файлами.