Открыт файл: этот плохой стиль Python?

Чтобы прочитать содержимое файла:

data = open(filename, "r").read()

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

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

Ответ 1

Только для записи: Это немного больше и немедленно закрывает файл:

from __future__ import with_statement

with open(filename, "r") as f:
    data = f.read()

Ответ 2

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

Ответ 3

Код работает точно так, как вы говорите, но это плохой стиль. Ваш код основывается на предположениях, которые могут быть истинными сейчас, но не всегда будут истинными. Не исключено, что ваш код будет запущен в ситуации, когда файл, который открывается и не закрывается, имеет значение. Действительно ли это стоит того, чтобы сэкономить 1 или 2 строки кода? Я так не думаю.

Ответ 4

Нет, это вполне разумный IMO в стиле Python, согласно вашим рассуждениям.

Обновление:. Здесь много комментариев о том, как быстро удалить файлы файлов или нет. Вместо того, чтобы спекулировать, я сделал кое-что. Вот что я вижу:


Из комментария в Python object.h:

Макросы Py_INCREF (op) и Py_DECREF (op) используются для увеличения или декремент ссылок. Py_DECREF вызывает средство освобождения объекта функция, когда refcount падает до 0

Глядя на Python fileobject.c:

Таблица функций для файловых объектов указывает на функцию file_dealloc. Эта функция вызывает close_the_file, который, в свою очередь, закрывает файл.


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

Ответ 5

Несмотря на то, что он работает так, как ожидалось, я думаю, что он не работает по двум причинам:

  • Ваш код не будет масштабироваться без сбоев, потому что вы читаете весь файл в памяти, и это может быть или не быть обязательно тем, что вы хотите.
  • В соответствии с Zen of Python (попробуйте import this в приглашении Python для его получения) "явный лучше, чем неявный", и, неявно закрыв файл, вы можете смутить кого-то, кто по дороге будет оставить свой код для обслуживания.

Это действительно помогает быть явным! Python поощряет явный стиль.

Кроме того, для броузера script ваш стиль имеет смысл.

Возможно, вы получите этот ответ.

Ответ 6

выглядит хорошо для меня.. Я часто читаю такие файлы.