РАЗБИРАЕМ ПО ШАГАМ
От идеи к работающему коду
Данные могут храниться отдельно от программы в текстовых файлах. Научимся задавать пути, читать UTF-8 и обрабатывать строки, не теряя пустые записи и последние строки файла.
Сразу к запуску примера ↓
- 1Путь к файлу
- 2Чтение текста
- 3Обработка строк
1. Путь и рабочая папка
Path из pathlib представляет путь. Относительный путь отсчитывается от текущей рабочей папки запуска, а не обязательно от папки открытого редактора.
В браузере файлы находятся в виртуальной файловой системе интерпретатора. Они не открывают документы твоего компьютера. Для повторяемого примера сначала создадим небольшой учебный файл; настоящий проект запускаем из своей папки локально.
from pathlib import Pathpath = Path("questions.txt")path.write_text("Вопрос 1\n\nВопрос 2\n", encoding="utf-8")print(path.read_text(encoding="utf-8"))2. Чтение с with
open открывает файл и возвращает файловый объект. with закрывает его при выходе из блока, даже если внутри возникла ошибка. Режим r означает чтение.
encoding="utf-8" задаёт способ преобразования байтов в текст и помогает одинаково читать русские буквы на разных компьютерах. Файл должен быть действительно сохранён в этой кодировке.
from pathlib import PathPath("notes.txt").write_text("Привет, Барсик!", encoding="utf-8")with open("notes.txt", "r", encoding="utf-8") as file: text = file.read()print(text)3. Все строки, включая пустые
splitlines разбивает текст на строки без символов перевода строки. Внутренняя пустая строка остаётся отдельным элементом. Последний завершающий перенос сам по себе не добавляет лишнюю запись.
Пустой строкой для статистики договоримся считать строку без непробельных символов: not line.strip(). Срез lines[-5:] безопасно возвращает до пяти последних строк, даже если их меньше.
text = "первая\n\nтретья\n"lines = text.splitlines()empty = 0for line in lines: if not line.strip(): empty += 1print("Всего:", len(lines))print("Пустых:", empty)print(lines[-5:])4. Список файлов в папке
glob("*.txt") находит подходящие пути внутри выбранной папки. Сортируем их для предсказуемого меню. is_file отбрасывает папки, если они попали в набор. enumerate(files, start=1) выдаёт пару: номер от 1 и путь к файлу.
Как и в меню списка, номер пользователя проверяем до обращения по индексу. Если файлов нет, показываем сообщение. Ошибки отсутствующего файла научимся обрабатывать через try/except.
from pathlib import Pathfiles = []for path in Path(".").glob("*.txt"): if path.is_file(): files.append(path)files = sorted(files)for number, path in enumerate(files, start=1): print(number, path.name)if not files: print("Текстовых файлов нет")Где легко ошибиться
- Искать относительный файл в другой рабочей папке.
- Не указать кодировку для русскоязычных учебных данных.
- Удалить пустые строки до того, как их требуется посчитать.
Проверь понимание: Где Python ищет Path("notes.txt")?
В текущей рабочей папке процесса. Её можно узнать через Path.cwd().
