Як безпечно відкривати / закривати файли в 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створення винятку.
Jon-Eric

4
Це те, що заява with перекладається за лаштунки.
Arlaharen

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-konačno:

>>> 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.