Закройте открытый файл данных h5py
В нашей лаборатории мы храним наши данные в файлах hdf5
через пакет python h5py
.
В начале эксперимента мы создаем файл hdf5
и сохраняем массив после массива массива данных в файле (между прочим). Когда эксперимент выходит из строя или прерывается, файл закрывается неправильно.
Поскольку наши эксперименты выполняются с iPython
, ссылка на объект данных остается (где-то) в памяти.
Есть ли способ сканирования всех открытых объектов данных h5py и их закрытия?
Ответы
Ответ 1
Вот как это можно сделать (я не мог понять, как проверить закрытость файла без исключений, может быть, вы найдете):
import gc
for obj in gc.get_objects(): # Browse through ALL objects
if isinstance(obj, h5py.File): # Just HDF5 files
try:
obj.close()
except:
pass # Was already closed
Другая идея:
Как использовать файлы, как использовать диспетчер контекста и ключевое слово with
?
with h5py.File("some_path.h5") as f:
f["data1"] = some_data
Когда поток программы выходит из с-блока, файл закрывается независимо от того, что происходит, включая исключения и т.д.
Ответ 2
pytables
(который использует h5py
) отслеживает все открытые файлы и предоставляет простой способ принудительно закрыть все открытые файлы hdf5
.
import tables
tables.file._open_files.close_all()
Этот атрибут _open_files
также имеет полезные методы для предоставления вам информации и обработчиков для открытых файлов.
Ответ 3
Я обнаружил, что hFile.bool() возвращает True, если он открыт, и False в противном случае. Это может быть самый простой способ проверить.
Другими словами, сделайте это:
hFile = h5py.File(path_to_file)
if hFile.__bool__():
hFile.close()