Мне непонятно, почему вы не получаете 2 поля в вашем AcqFlags
наборе данных. Мне удалось заставить ваш сегмент кода работать с небольшой модификацией. (Я использую h5py 2.9.0. В h5py 2.10.0 для строк переменной длины был добавлен новый dtype. Это изменение отмечено комментариями в объявлениях dt=
. Это не ошибка в вашем коде.) См. Ниже.
import h5py, numpy as np
import time
def storeFlagsFile(FLAGS_F, file_name, t0, text, ID):
if not FLAGS_F: # this flag doesnt work for mulitple users
with h5py.File(file_name, "r+") as f:
data_content = np.array([np.round(time.time() - t0, 3), text])
asciiList = np.array([str(n).encode("utf-8", "ignore") for n in data_content]).reshape(1, 2)
#dt = h5py.string_dtype(encoding='utf-8') # for h5py 2.10.0
dt = h5py.special_dtype(vlen=str) # for h5py 2.9.0
dset = f[str(ID)].create_dataset('AcqFlags', data=asciiList, compression="gzip", chunks=True, maxshape=(None, 2), dtype=dt)
FLAGS_F = 1
else:
with h5py.File(file_name, "r+") as f:
data_content = np.array([np.round(time.time() - t0, 3), text])
asciiList = np.array([str(n).encode("utf-8", "ignore") for n in data_content]).reshape(1, 2)
f[str(ID)+'/AcqFlags'].resize((f[str(ID)+'/AcqFlags'].shape[0] + 1), axis = 0)
f[str(ID)+'/AcqFlags'][-1:] = asciiList
file_name = 'SO_62064344.h5'
ID = 122
with h5py.File(file_name, 'w') as f:
f.create_group(str(ID))
storeFlagsFile(False, file_name, 4.412, 'a', ID)
storeFlagsFile(True, file_name, 5.412, 'b', ID)
storeFlagsFile(True, file_name, 6.412, 'c', ID)
storeFlagsFile(True, file_name, 8.226, 'd', ID)
storeFlagsFile(True, file_name, 9.773, 'e', ID)
Дополнительные мысли / наблюдения:
- Я заметил, что вы сохраняете значение времени в виде строки. Это то, что вы хотите? HDF5 и h5py могут хранить разные типы данных в каждом поле / столбце, поэтому вы можете смешивать числа с плавающей запятой и строки и, если хотите. Требуется другой тип dtype (например, массив записей).
- Вы используете FLAGS_F как флаг для создания набора данных
AcqFlags
. Вы можете упростить это, чтобы проверить наличие, или использовать require_dataset
. - Вы добавляете по одной строке в набор данных с изменяемым размером. Это нормально для наборов данных smalli sh, но может быть проблемой производительности, если вы создаете 10e6 строк по 1 строке за раз.
Если вам интересно, я ответил на другие вопросы, которые показывают, как сделать № 2 и № 3 выше. Один из этих ответов может оказаться полезным: