В реальной жизни, для закрытия файлов, чаще всего, используется конструкция
with
. Её намного удобней использовать, чем закрывать файл явно. Но, так как в жизни можно встретить и методclose
, в этом разделе рассматривается как его использовать.
После завершения работы с файлом, его нужно закрыть.
В некоторых случаях, Python может самостоятельно закрыть файл.
Но лучше на это не рассчитывать и закрывать файл явно.
close()
Метод close встречался в разделе .
Там он был нужен для того, чтобы содержимое файла было записано на диск.
Для этого, в Python есть отдельный метод flush()
.
Но, так как, в примере с записью файлов, не нужно было больше выполнять никаких операций, файл можно было закрыть.
Откроем файл r1.txt:
In [1]: f = open('r1.txt', 'r')
Теперь можно считать содержимое:
In [2]: print(f.read()) ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
У объекта file есть специальный атрибут closed
, который позволяет проверить закрыт файл или нет.
Если файл открыт, он возвращает False
:
In [3]: f.closed Out[3]: False
Теперь закрываем файл и снова проверяем closed
:
In [4]: f.close() In [5]: f.closed Out[5]: True
Если попробовать прочитать файл, возникнет исключение:
In [6]: print(f.read()) ------------------------------------------------------------------ ValueError Traceback (most recent call last) <ipython-input-53-2c962247edc5> in <module>() ----> 1 print(f.read()) ValueError: I/O operation on closed file
try/finally
для работы с файламиС помощью обработки исключений, можно:
finally
Если попытаться открыть для чтения файл, которого не существует, возникнет такое исключение:
In [7]: f = open('r3.txt', 'r') --------------------------------------------------------------------------- IOError Traceback (most recent call last) <ipython-input-54-1a33581ca641> in <module>() ----> 1 f = open('r3.txt', 'r') IOError: [Errno 2] No such file or directory: 'r3.txt'
С помощью конструкции try/except
, можно перехватить это исключение и вывести своё сообщение:
In [8]: try: ....: f = open('r3.txt', 'r') ....: except IOError: ....: print('No such file') ....: No such file
А с помощью части finally
, можно закрыть файл, после всех операций:
In [9]: try: ....: f = open('r1.txt', 'r') ....: print(f.read()) ....: except IOError: ....: print('No such file') ....: finally: ....: f.close() ....: ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 ! In [10]: f.closed Out[10]: True