раздел 02
Текстовые файлы
Файл - это первый способ, при котором данные переживают перезапуск. Записали строку в файл на диске, закрыли программу, открыли снова, прочитали - всё на месте. Это огромный шаг по сравнению с переменной, и при этом почти такой же простой.
Что это
Текстовый файл - это просто последовательность символов, сохранённая на диск под каким-то именем: notes.txt, log.txt, data.txt. Открывается чем угодно: блокнотом, VS Code, вашей программой.
купить молоко
позвонить маме
сдать отчёт
Никакого волшебства: это ровно тот текст, что вы видите. Программа может его прочитать целиком или дописать в конец новую строку.
Зачем это
Файл - правильный выбор, когда:
- данных немного и они простые (заметки, лог событий, настройки);
- структура несложная - список строк или пара значений;
- с данными работает одна программа на одной машине;
- хочется, чтобы человек мог открыть файл глазами и всё понять.
Типичные применения: лог работы скрипта, накопление результатов парсинга, простой список, экспорт «на посмотреть».
Как это работает
Программа делает с файлом три вещи: читает, перезаписывает целиком или дописывает в конец.
# записать (перезапишет файл целиком)
with open("notes.txt", "w", encoding="utf-8") as f:
f.write("купить молоко\n")
f.write("позвонить маме\n")
# дописать в конец, не стирая старое
with open("notes.txt", "a", encoding="utf-8") as f:
f.write("сдать отчёт\n")
# прочитать всё
with open("notes.txt", "r", encoding="utf-8") as f:
text = f.read()
print(text)
Три режима, которые важно не перепутать:
"w"(write) - стирает старое содержимое и пишет заново;"a"(append) - дописывает в конец, старое сохраняется;"r"(read) - только чтение.
Пример: счётчик запусков
# увеличиваем число при каждом запуске скрипта
try:
with open("count.txt", "r") as f:
count = int(f.read())
except FileNotFoundError:
count = 0 # файла ещё нет - значит, первый запуск
count += 1
with open("count.txt", "w") as f:
f.write(str(count))
print(f"Запуск номер {count}")
Обратите внимание на FileNotFoundError: при самом первом запуске файла ещё нет, и это надо предусмотреть.
Где у простого текста потолок
Текстовый файл хорош, пока данные - это просто строки. Как только появляется структура («у каждой задачи есть текст, дата и статус»), голый текст становится неудобным: придётся самому придумывать, как разделять поля, и самому это разбирать при чтении.
Тут и появляются форматы CSV и JSON - это всё те же текстовые файлы, но с понятной структурой внутри. О них следующие разделы.
Антипаттерны
- Хранить таблицу в .txt, изобретая свой разделитель. Для таблиц есть CSV, для структуры - JSON. Не придумывайте свой формат.
- Перезаписывать (
"w") там, где нужно дописать ("a"). Потеря данных в одну букву. - Забыть
encoding="utf-8". На русском тексте без указания кодировки легко получить кракозябры (подробнее - в разделе про CSV).
Что дальше
Сначала научимся уверенно читать и писать файлы - где они лежат и почему путь так важен. А потом перейдём к структурированным форматам.