Закройте открытый файл данных 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()