Как написать и добавить в файл h5 несколько раз в Python? - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь записать наборы данных в файл h5 следующим образом:

fpath = 'path-to-/data.h5'
with h5py.File(fpath,'w') as hf:
    hf.create_dataset('a', data=a)

Затем я добавляю файл с дополнительными данными в том же коде:

with h5py.File(fpath,'a') as hf:
    dset = hf.create_dataset('b',(nrow,1),maxshape=(nrow,None),chunks=(nrow,1))
    for i in range(ncol):
        dset[:,-1:] = b
        if i+1 < ncol:
            dset.resize(dset.shape[1]+1,axis=1)

Я получаю следующую ошибку в отношении второй операции (добавление):

OSError: Unable to create file (unable to open file: name = 'path-to-/data.h5', 
    errno = 2, error message = 'Aucun fichier ou dossier de ce type',
    flags = 13, o_flags = 242)

Когда я проверяю каталог, файл path-to-/data.h5 существует, но без добавленных наборов данных (проверяется с помощью list(hf.keys())).

Чтобы все это работало, в настоящее время я пишу все за один шаг и не использую оператор with (как предложено в вопросе EDIT здесь ).

hf = h5py.File(fpath,'w')
hf.create_dataset('a', data=a)
dset = hf.create_dataset('b',(nrow,1),maxshape=(nrow,None),chunks=(nrow,1))
for i in range(ncol):
    dset[:,-1:] = b
    if i+1 < ncol:
        dset.resize(dset.shape[1]+1,axis=1)
hf.close()

Здесь также, если я удаляю записанный файл и снова запускаю код, он выдает ту же ошибку, что и выше, и запускается, только когда я изменяю имя файла (например, «data_1.h5»).Я не понимаю эту часть, так как ожидал, что операция h5py.File(fpath,'w') будет независима от существования или отсутствия файла.

Подводя итог, я нашел единственный способ заставить код работать:используя второй подход (запись без добавления) и не изменяйте сгенерированный файл (переименование или перемещение).

Я не смог найти его здесь , но есть ли способпринудительно написать и добавить файл h5 независимо от его существования или предыдущих вызовов?

1 Ответ

1 голос
/ 01 мая 2019

@ nish-ant, я создал простой MCVE, чтобы продемонстрировать опции 'w' и 'a' с двумя простыми наборами данных. Он копирует ваш процесс (насколько я понимаю) в 1 программе. Сначала я открываю файл с параметром «w», закрываю, затем снова открываю с параметром «a». Работает как положено. Просмотрите и сравните с вашим кодом. Возможно, это поможет вам определить ошибку доступа к файлу.
Я также успешно проверил с этими параметрами файла:
1. «ш» для 1; тогда 'r +' для 2
2. «а» для 1; тогда «а» для 2

import h5py
import numpy as np

#Create array_to_be_saved
arr1 = np.arange(18.).reshape(3,6)
arr2 = 2.0*arr1

fpath = 'SO_55936567_data.h5'
with h5py.File(fpath,'w') as h5f:
    h5f.create_dataset('a', data=arr1)

h5f.close()

with h5py.File(fpath,'a') as h5f:
    h5f.create_dataset('b', data=arr2)

h5f.close()

print ('done')
...