with это менеджер контекста, он работает как Exception и гарантирует выполнение завершающих действий (например, закрытие файла) вне зависимости от того, произошло исключение внутри блока кода или нет.
вот пример:
rdir = "/mnt/sdcard/бла-бла-бла-путь-куда-хотим-писать/"
out_file = open(rdir+"test.txt", "wt") # открываем файл
out_file.write('some text /n') # пишем в файл какуюто ахинею
# тут мы еще пишем 100500 строк кода, в котором может быть что угодно
out_file.write('another text /n') # пишем в файл какуюто ахинею
out_file.close() # закрывам файл
Метод close завершает формирование содержимого файла и освобождает системные ресурсы.
Обычно файлы автоматически закрываются, когда объект файла уничтожается интерпретатором при сборке мусора (т.е. когда в сценарии исчезнет послдняя ссылка на объект).
А теперь представь что гдето между out_file = open(rdir+“test.txt”, “wt”) и out_file.close() программа вызвала ошибку и аварийно завершилась. Наш файл так и останеться открытым. И к нему никто не сможет обратиться.
Можно использовать try-except-finally:
rdir = "/mnt/sdcard/бла-бла-бла-путь-куда-хотим-писать/"
out_file = open(rdir+"test.txt", "wt") # открываем файл
try:
out_file.write('some text /n') # пишем в файл какуюто ахинею
# тут мы еще пишем 100500 строк кода, в котором может быть что угодно
out_file.write('another text /n') # пишем в файл какуюто ахинею
finally:
out_file.close() # закрывам файл
Теперь даже если гдето в try:… возникнет исключение файл закроеться.
чтобы каждый раз не писать конструкции try-except-finally придумали with. Тот же код с with будет выглядеть так:
rdir = "/mnt/sdcard/бла-бла-бла-путь-куда-хотим-писать/"
with open(rdir+"test.txt", "wt") as out_file:
out_file.write('some text /n') # пишем в файл какуюто ахинею
# тут мы еще пишем 100500 строк кода, в котором может быть что угодно
out_file.write('another text /n') # пишем в файл какуюто ахинею
out_file.close() писать не нужно, он должен сам закрыться по завершении блока with, даже если внутри with возникло исключение( хотя ктото гдето писал что в определенных случаях файл может не закрыться).
Блок with работает с объектами, значит все что пожелаешь запихнуть не получится. Для того чтобы корректно отработал блок нужно добавить в объект дополнительно еще два метода __enter__, __exit__
Некоторые встроенные объекты по умолчанию поддерживают протокол, например, файлы.
Вот тут можно прочитать подробнее на русском с поясненими про with
https://habrahabr.ru/post/196382/WellRai
И как этот файл записать в переменную?
в смысле? содержимое файла? так ты ж его на запись открываеш, он пустой создасться даже если такой файл уже есть.