раздел 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).

Что дальше

Сначала научимся уверенно читать и писать файлы - где они лежат и почему путь так важен. А потом перейдём к структурированным форматам.

Подразделы