Как безопасно открывать / закрывать файлы в Python 2.4

86

В настоящее время я пишу небольшой скрипт для использования на одном из наших серверов с использованием Python. На сервере установлен только Python 2.4.4.

Я не начинал использовать Python, пока не вышла версия 2.5, поэтому я привык к форме:

with open('file.txt', 'r') as f:
    # do stuff with f

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

Как лучше всего безопасно избавляться от файловых объектов при использовании старых версий Python?

TM.
источник

Ответы:

139

См. Docs.python.org :

Когда вы закончите работу с файлом, вызовите f.close (), чтобы закрыть его и освободить все системные ресурсы, занятые открытым файлом. После вызова f.close () попытки использовать файловый объект автоматически завершатся ошибкой.

Следовательно, используйте close()элегантно try/finally:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
    f.close()

Это гарантирует, что даже если возникнет # do stuff with fисключение, fон все равно будет правильно закрыт.

Обратите внимание , что openдолжно появиться вне из try. Если openсам вызывает исключение, файл не был открыт и его не нужно закрывать. Кроме того, если openвозникает исключение, его результат не назначается, fи вызов является ошибкой f.close().

Джон-Эрик
источник
Очень просто, спасибо. Почему-то я ожидал, что мне понадобится что-то более активное.
ТМ.
16
В случае openнеудачи исключение будет вызвано еще до try/finallyвхода в блок. Так closeчто называться не буду. (Вот почему вам следует позвонить openдо try.)
FogleBird,
1
@TM Я добавил примечание о openвозбуждении исключения.
Джон-Эрик,
4
Это то, что оператор with переводит за кулисами.
Арлахарен,
1
Открытие файла должно произойти во время попытки.
Энтони Ратледж
32

В приведенном выше решении повторяется здесь:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
   f.close()

если случится что-то плохое (никогда не знаешь ...) после успешного открытия файла и до попытки, файл не будет закрыт, поэтому более безопасным решением будет:

f = None
try:
    f = open('file.txt', 'r')

    # do stuff with f

finally:
    if f is not None:
       f.close()
млджрг
источник
Используя оператор with open (...), независимо от того, как был завершен блок with (даже с исключением), файл будет закрыт
darkgaze
@darkgaze with open(...)- определенно лучший выбор в современном Python.
mljrg
11

Нет необходимости закрывать файл в соответствии с документами, если вы используете:

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

>>> with open('workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

Подробнее здесь: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

user3765030
источник
Это и правильно, и не обращает внимания на вопрос.
Джон-Эрик
-4

Вот пример того, как использовать openи "pythonclose

from sys import argv
script,filename=argv
txt=open(filename)
print "filename %r" %(filename)
print txt.read()
txt.close()
print "Change the file name"
file_again=raw_input('>')
print "New file name %r" %(file_again)
txt_again=open(file_again)
print txt_again.read()
txt_again.close()

Это необходимо для того, сколько раз вы открывали файл, чтобы закрыть это время.

Варун Чхангани
источник
1
Если исключение возникает после, openно раньше close, файл не будет должным образом закрыт с использованием этого подхода. Использование withили try/ finallyзакрывает файл должным образом даже при наличии исключений.
Джон-Эрик