Open (). Read () безопасно? - PullRequest
       1

Open (). Read () безопасно?

17 голосов
/ 23 марта 2012

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

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

# or

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

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

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

Ответы [ 3 ]

20 голосов
/ 23 марта 2012

Недостатком

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

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

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

5 голосов
/ 23 марта 2012

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

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

2 голосов
/ 23 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...