Как безопасно открывать / закрывать файлы в 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?

Ответы:


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


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

-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закрывает файл должным образом даже при наличии исключений.
Джон-Эрик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.