Проблема записи наборов данных в файл .hdf5 в цикле for - PullRequest
1 голос
/ 16 мая 2019

Я перебираю несколько файлов и считываю нужную мне информацию, она сохраняется в массивном массиве, который я затем записываю в файловый объект h5py с уникальным именем (например, outputdataset_1, outputdataset_2 ...).Однако, когда скрипт запускается, он записывает только окончательный набор данных в файл (outputdataset_numFiles).

Ради простоты весь синтаксический анализ файла был абстрагирован в цикл if и функцию "get_data".Справедливо и допустимо предположить, что когда код достигает конца файла, структура данных pts содержит все правильные значения.

for num in range(1,numFiles):
    with h5py.File("outputFileName.hdf5", "w") as f:
        with open("fileAddress" +str(num)) as file:
                lineNum = 0
                while True:
                    line = file.readline(lineNum)
                    if not line and lineNum != 0:
                        s = 'outputdataset_' +str(num)
                        dset = f.create_dataset(s,pts.shape,data=pts)
                        break;
                    if line == criteria:
                        pts = get_data(pts,line)
                    lineNum += 1

1 Ответ

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

Проблема заключается в порядке строк for num in range(…) и with h5py.File(…); как вы его написали, вы будете закрывать файл каждый раз, когда загружаете новый файл, и, поскольку h5py.File() вызывается в режиме 'w', он будет (правильно) перезаписывать "outputfilename.hdf5" в каждом цикле.

Решение: просто переключите эти линии.

В качестве альтернативы (но это, вероятно, требует больше кода!), Вы можете использовать режим файла «добавления», то есть with h5py.File("outputFileName.hdf5", "a") as f - но тогда вы, скорее всего, столкнетесь с RuntimeError: 'Unable to create link (name already exists)', если вы запустите скрипт более одного раза (итеративно). Вы можете , конечно, написать дополнительный код, который проверяет существующие пути в файле hdf5 и реализует некоторую логику обновления / замены, но это может занять некоторое время для кодирования.

...