Имейте в виду, что объект Path
предназначен для работы с путями файловой системы. Как и во встроенной библиотеке из Python, существует метод open , но в объекте Path нет закрытия.
.close
находится в дескрипторе файла, который возвращается либо встроенным open , либо с помощью метода открытия объекта Path:
>>> from pathlib import Path
>>> p=Path(some_file)
>>> p
PosixPath('/tmp/file')
You Вы можете открыть этот объект Path с помощью встроенной функции open или метода open в объекте Path:
>>> fh=open(p) # open built-in function
>>> fh
<_io.TextIOWrapper name='/tmp/file' mode='r' encoding='UTF-8'>
>>> fh.close()
>>> fh=p.open() # Path open method which aliases to os.open
>>> fh
<_io.TextIOWrapper name='/tmp/file' mode='r' encoding='UTF-8'>
>>> fh.close()
Вы можете посмотреть исходный код pathlib на Github в качестве указания на то, как авторы pathlib
делают это в своем собственном коде.
То, что я наблюдаю, является одной из трех вещей.
Наиболее распространенным на сегодняшний день является использование with
:
from pathlib import Path
p=Path('/tmp/file')
#create a file
with p.open(mode='w') as fi:
fi.write(f'Insides of: {str(p)}')
# read it back and test open or closed
with p.open(mode='r') as fi:
print(f'{fi.read()} closed?:{fi.closed}')
# prints 'Insides of: /tmp/file closed?:False'
Как вы, вероятно, знаете, в конце блока with
вызываются методы __exit__
. Для файла это означает, что файл закрыт. Это наиболее распространенный подход в исходном коде pathlib
.
Во-вторых, в источнике также видно, что объект pathlib поддерживает состояние входа и выхода, а также флаг открытия и закрытия файла. Однако функции os.close
явно не вызываются. Вы можете проверить этот статус с помощью аксессора .closed
.
fh=p.open()
print(f'{fh.read()} closed?:{fh.closed}')
# prints Insides of: /tmp/file closed?:False
# fi will only be closed when fi goes out of scope...
# or you could (and should) do fh.close()
with p.open() as fi:
pass
print(f'closed?:{fi.closed}')
# fi still in scope but implicitly closed at the end of the with bloc
# prints closed?:True
В-третьих, при cPython файлы закрываются, когда дескриптор файла выходит из области видимости. Это не переносимо или считается «хорошей практикой», на которую можно положиться, но обычно это так. Есть примеры этого в исходном коде pathlib.