Файлы и with
Переменные похожи на записи мелом на доске. Пока программа работает, их можно читать и стирать. Когда программа завершается, доску вытирают начисто, и при следующем запуске она пуста.
Чтобы данные дожили до следующего запуска, их записывают в файл. Файл — это тетрадь в ящике стола: её открывают, пишут, закрывают и кладут обратно, а записи остаются. Тетрадь открывает встроенная функция open.
Задачи курса выполняются в браузере, где файлов вашего компьютера нет. Поэтому примеры этого урока запускайте у себя, в отдельной папке:
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']Давайте разберём пример по строкам:
open("notes.txt", "w", encoding="utf-8")открывает файл для записи и возвращает файловый объект. Словаas fдают ему имя.- Метод
writeзаписывает строку как есть и сам перевод строки не добавляет, поэтому в конце каждой строки стоит\n. - Второй
withоткрывает тот же файл для чтения, а методreadвозвращает всё его содержимое одной строкой. 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 убирает этот символ:
with open("notes.txt", encoding="utf-8") as f:
for line in f:
print(line.strip(), end=";") # milk;bread;Цикл читает файл по частям, а не целиком. Поэтому так можно пройти и файл больше оперативной памяти: весь файл в памяти сразу не лежит.
Частая ошибка
Программу запустили из другой папки, и файл не нашёлся:
with open("notes.txt", encoding="utf-8") as f: # ✗
print(f.read())FileNotFoundError: [Errno 2] No such file or directory: 'notes.txt'Путь "notes.txt" интерпретатор отсчитывает от текущей папки — той, из которой запустили команду, а не той, где лежит программа. Запускайте программу из папки с файлом или укажите полный путь к нему.
Главное
openвозвращает файловый объект, аwithзакрывает файл в конце блока, даже при исключении.- Режим
"w"стирает файл при открытии,"a"дописывает в конец,"r"читает. - Пишите
encoding="utf-8", чтобы текст читался одинаково на любом компьютере. - Цикл
forпо файлу получает строки по одной, каждая с\nна конце.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.