Объясните конструкцию with as

Есть небольшой пример вызова этой конструкции для открытия файлов:

# method1
with open('group.pickle', 'wb') as p:
    p.write(ser_pickle)

#method2
with open('group.pickle', 'wb') as p:
    pickle.dump(my_favourite_group, p)


#method1
with open('group.json', 'w', encoding='utf-8') as j:
    j.write(ser_json)

#method2
with open('group.json', 'w') as j:
    json.dump(my_favourite_group, j)

Что в данном случае значат части когда "as j: as p:", что за j и p?


Ответы (1 шт):

Автор решения: S. Nick

Чтение и запись файлов.

f = open('workfile', 'w')

open() возвращает объект файла и чаще всего используется с двумя аргументами: open(имя файла, режим).

Хорошей практикой является использование ключевого слова with при работе с файловыми объектами. Преимущество заключается в том, что файл правильно закрывается после завершения его набора, даже если в какой-то момент возникает исключение. Использование with также намного короче, чем написание эквивалентных блоков try-finally:

with open('workfile') as f:     # файловый объект с именем `f`

Если вы не используете ключевое слово with, вам следует вызвать f.close(), чтобы закрыть файл и немедленно освободить все используемые им системные ресурсы. Если вы явно не закроете файл, сборщик мусора в Python в конечном итоге уничтожит объект и закроет открытый файл для вас, но файл может оставаться открытым некоторое время. Другой риск состоит в том, что разные реализации Python будут выполнять эту очистку в разное время.


Update

А можете подробнее объяснить то, что мы обсудили в комментариях? Чем в вашем коде является f? Она же не хранит сам файл?

Сам файл у вас находится где-то на диске, файловый объект с именем f содержит все необходимое для работы с этим файлом.

with open('test.txt') as f:     # файловый объект с именем `f`
   print(f)
   print(type(f))
   print(help(f))
   print(dir(f))
   print(f.__doc__)
   # ...
→ Ссылка