Удалить подгруппу из файла HDF5 в Python

Я пытаюсь удалить подгруппу, которую я написал в файле HDF5, используя h5py в Python. Например, согласно документации, подгруппу под названием «MyDataset» можно удалить с помощью:

del subgroup["MyDataset"] 

Я сделал это, и фактически подгруппа больше не доступна. Однако файлы не уменьшают его размер. Мой вопрос, возможно ли восстановить пространство из удаленных подгрупп с помощью h5py без необходимости перезаписи оставшихся подгрупп в совершенно новый файл? Ниже я привожу небольшой пример, который иллюстрирует то, что я говорю:

import numpy as np
import h5py

myfile = h5py.File('file1.hdf5')
data = np.random.rand(int(1e6))
myfile.create_dataset("MyDataSet", data=data)
myfile.close()

Затем я открываю файл и удаляю предыдущую запись:

myfile = h5py.File('file1.hdf5')
del myfile["MyDataSet"]

и если вы попытаетесь получить данные, используя:

myfile["MyDataSet"].value

вы поймете, что данные больше не доступны. Однако, если вы проверите размер файла, он останется постоянным до и после вызова del.


person Alejandro    schedule 31.03.2016    source источник


Ответы (1)


del myfile["MyDataSet"] изменяет объект File, но не изменяет базовый файл file1.hdf5. Файл file1.hdf5 не изменяется до тех пор, пока не будет вызван myfile.close().

Если вы используете with-statement, myfile.close() будет вызываться автоматически для вас, когда Python покинет with-statement:

import numpy as np
import h5py
import os

path = 'file1.hdf5'
with h5py.File(path, "w") as myfile:
    data = np.random.rand(int(1e6))
    myfile.create_dataset("MyDataSet", data=data)
    print(os.path.getsize(path))

with h5py.File(path, "a") as myfile:
    del myfile["MyDataSet"]
    try:
        myfile["MyDataSet"].value
    except KeyError as err:
        # print(err)
        pass

print(os.path.getsize(path))

отпечатки

8002144         <-- original file size
2144            <-- new file size

Обратите внимание, что в первый раз при открытии File в режиме записи ("w") создается новый файл, во второй раз открытие File в режиме добавления ("a", по умолчанию) позволяет читать существующий файл и изменять его.

person unutbu    schedule 31.03.2016
comment
Ой. Я понимаю. Я забыл закрыть файл. На самом деле я не очень привык к использованию with, но мне очень нравится, как вы это делаете. Насколько я понимаю, with всегда будет вызывать метод exit, который для h5py.File кажется close()? Большое спасибо за хороший пример! - person Alejandro; 31.03.2016
comment
Да все верно. Метод __exit__ вызывает close(). Начиная с h5py 2.0, файлы необходимо закрывать вручную, вызывая метод «закрыть» или используя файловый объект в качестве менеджера контекста. (из Что нового в h5py версии 2.0). - person unutbu; 31.03.2016