Открыто(). Read() безопасно? - программирование
Подтвердить что ты не робот

Открыто(). Read() безопасно?

Я пишу много кода Python, где я просто хочу прочитать файл для переменной. Я знаю два рекомендуемых способа -

with open('file') as f:
    data = f.read()

# or

fo = open('file')
data = f.read()
fo.close()

Мои вопросы, каковы недостатки этого?

data = open('file').read()
4b9b3361

Ответ 1

Недостаток

data = open('file').read()

заключается в том, что в зависимости от вашей реализации Python очистка объекта открытого файла может произойти или не произойти сразу. Это означает, что файл останется открытым, потребляя дескриптор файла. Вероятно, это не проблема для одного файла, но в цикле это может быть проблемой.

В определенных условиях CPython (обычная реализация Python) использует объекты с подсчетом ссылок, поэтому файл почти наверняка произойдет сразу. Однако это не обязательно верно для других реализаций, таких как IronPython или Jython.

Ответ 2

Недостатком является то, что после первого и второго блоков вы можете быть уверены, что ваш файл закрыт. (В первом случае даже в случае возникновения исключения).

Краткая форма не дает вам такой гарантии.

Ответ 3

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

Многие генераторные gcs очистят эти объекты (созданные в области, без каких-либо ссылок на нее в конце области) сразу же, но это не может быть гарантировано. Таким образом, лучше придерживаться явного закрытия файла, чтобы быть уверенным.