Перейти к содержимому
Теория · Модули, файлы и генераторы · урок 4 из 12

Файлы и with

Переменные похожи на записи мелом на доске. Пока программа работает, их можно читать и стирать. Когда программа завершается, доску вытирают начисто, и при следующем запуске она пуста.

Чтобы данные дожили до следующего запуска, их записывают в файл. Файл — это тетрадь в ящике стола: её открывают, пишут, закрывают и кладут обратно, а записи остаются. Тетрадь открывает встроенная функция open.

Задачи курса выполняются в браузере, где файлов вашего компьютера нет. Поэтому примеры этого урока запускайте у себя, в отдельной папке:

Python
with open("notes.txt", "w", encoding="utf-8") as f:
    f.write("milk\n")
    f.write("bread\n")

with open("notes.txt", encoding="utf-8") as f:
    text = f.read()
print(len(text), text.split())  # 11 ['milk', 'bread']

Давайте разберём пример по строкам:

  1. open("notes.txt", "w", encoding="utf-8") открывает файл для записи и возвращает файловый объект. Слова as f дают ему имя.
  2. Метод write записывает строку как есть и сам перевод строки не добавляет, поэтому в конце каждой строки стоит \n.
  3. Второй with открывает тот же файл для чтения, а метод read возвращает всё его содержимое одной строкой.
  4. print печатает длину и слова: split без аргумента делит строку и по переводам строки.

Внутри строки Python перевод строки записывают двумя знаками \n, но это один символ. Поэтому в text 11 символов: четыре буквы milk, пять букв bread и два перевода строки.

Блок with

Блок with закрывает файл, когда заканчивается его тело, даже если в теле возникло исключение. Закрытие сохраняет записанное на диск и освобождает файл для других программ.

Это как тетрадь, которую кто-то всегда убирает за вами в ящик, даже если вас позвали посреди фразы. Без with файл пришлось бы закрывать вручную, а об этом можно забыть.

Режимы открытия

Второй аргумент open — режим. Он решает, что делать с файлом, которого нет, и с файлом, который уже есть:

РежимФайла нетФайл есть
"r" (по умолчанию)FileNotFoundErrorчитает с начала
"w"создаётстирает содержимое
"a"создаётдописывает в конец
"x"создаётFileExistsError

Режим "w" стирает файл уже при открытии, а не при первой записи. Тут аналогия с тетрадью перестаёт работать: открыть тетрадь — не значит вырвать из неё все страницы, а "w" делает именно это. Чтобы добавить строку к старым, открывайте файл в режиме "a".

Аргумент encoding="utf-8" задаёт кодировку — способ записать символы байтами. Без него Python берёт кодировку системы. Тогда русский текст, записанный на одном компьютере, на другом может прочитаться неверно.

Чтение по строкам

Файловый объект — итерируемый объект: цикл for получает из него строки по одной, и каждая заканчивается на \n. Метод strip убирает этот символ:

Python
with open("notes.txt", encoding="utf-8") as f:
    for line in f:
        print(line.strip(), end=";")  # milk;bread;

Цикл читает файл по частям, а не целиком. Поэтому так можно пройти и файл больше оперативной памяти: весь файл в памяти сразу не лежит.

Частая ошибка

Программу запустили из другой папки, и файл не нашёлся:

Python
with open("notes.txt", encoding="utf-8") as f:  # ✗
    print(f.read())
TEXT
FileNotFoundError: [Errno 2] No such file or directory: 'notes.txt'

Путь "notes.txt" интерпретатор отсчитывает от текущей папки — той, из которой запустили команду, а не той, где лежит программа. Запускайте программу из папки с файлом или укажите полный путь к нему.

Главное

  • open возвращает файловый объект, а with закрывает файл в конце блока, даже при исключении.
  • Режим "w" стирает файл при открытии, "a" дописывает в конец, "r" читает.
  • Пишите encoding="utf-8", чтобы текст читался одинаково на любом компьютере.
  • Цикл for по файлу получает строки по одной, каждая с \n на конце.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом