Я новичок в кодировании Python. Я хочу объединить данные из двух файлов H5 в основной файл H5. Моя цель — добавить все объекты в группах SRRXX/SRR630/*
в каждом исходном файле (имена файлов в списке h5_files
) в основной (целевой) файл (main_h5_path
). Код ниже — моя попытка сделать это. Когда я запускаю, я получаю это исключение:
Error occurred during H5 merging: 'Group' object has no attribute 'encode'
Я тоже попробовал create_group()
, но получил то же исключение.
Что мне нужно изменить, чтобы мой код работал?
#read the mainfile dataset
with h5py.File(main_h5_path, 'r') as h5_main_file_obj:
# return if H5 doesn't contain any data
if len(h5_main_file_obj.keys()) == 0:
return
main_file_timestamp_dtset_obj = h5_main_file_obj['/' + 'SRR6XX' + '/' + 'SRR630']
for file in h5_files:
with h5py.File(file, 'r') as h5_sub_file_obj:
# return if H5 doesn't contain any data
if len(h5_sub_file_obj.keys()) == 0:
continue
sub_file_timestamp_dtset_obj = h5_sub_file_obj['/' + 'SRR6XX' + '/' + 'SRR630']
# h5_main_file_obj.create_dataset(sub_file_timestamp_dtset_obj)
for ts_key in sub_file_timestamp_dtset_obj.keys():
print('ts_key', ts_key)
each_ts_ds = h5_sub_file_obj['/' + 'SRR6XX' + '/' + 'SRR630' + '/' + str(ts_key) + '/']
h5_main_file_obj.create_dataset(each_ts_ds)
except (IOError, OSError, Exception) as e:
print(f"Error occurred during H5 merging: {e}")
return -1
return 0
Перехват исключения затрудняет определение места возникновения проблемы. try/except
подобное позволяет вам по-новому интерпретировать ошибку для ваших пользователей, но не помогает отслеживать ошибки. Проблема может быть в том, как вы составляете group
имена.
Модераторы, ОП изменил сообщение, добавив код, и удалил изображение кода. Вопрос действителен и полезен для пользователей HDF5/h5py. Пожалуйста, рассмотрите возможность возобновления работы.
@ kcw78 1) нет вопросов, 2) они упоминают получение исключений, но в пост никаких исключений не включено.
Я изменил сообщение, чтобы преобразовать подразумеваемую проблему в вопрос. Также добавлен текстовый вывод исключения. (Кстати, это исключение в опубликованном коде.)
Мой исходный ответ копировал только имена групп из группы '/SRR6XX/SRR630
' в исходных файлах в основной (целевой) файл. ОП прокомментировал, что они хотят «скопировать имена групп вместе с их наборами данных».
Я обновил свой ответ, чтобы отразить этот запрос. Требуется всего лишь изменение 1 строки. (Для справки, строка создания групп закомментирована.)
Вот изменения в исходном коде, необходимые для того, чтобы это заработало:
ts_key
в вашем цикле — это имя объекта (а не объект). Используйте .items() для получения имен и объектов (или просто ссылайтесь на объект по имени).main_file_timestamp_dtset_obj
)Измененный код ниже:
def your_function:
with h5py.File(main_h5_path, 'a') as h5_main_file_obj: # need Append mode to add groups
# return if H5 doesn't contain any data
if len(h5_main_file_obj.keys()) == 0:
return
main_file_timestamp_dtset_obj = h5_main_file_obj['/SRR6XX/SRR630']
for file in h5_files:
with h5py.File(file, 'r') as h5_sub_file_obj:
# return if H5 doesn't contain any data
if len(h5_sub_file_obj.keys()) == 0:
continue
sub_file_timestamp_dtset_obj = h5_sub_file_obj['/SRR6XX/SRR630']
# h5_main_file_obj.create_dataset(sub_file_timestamp_dtset_obj)
for ts_key in sub_file_timestamp_dtset_obj.keys():
print('ts_key:', ts_key)
# This only creates group:
#main_file_timestamp_dtset_obj.create_group(ts_key)
# This copies Group and its objects (groups or datasets):
grp_path = 'SRR6XX/SRR630/' + ts_key
h5_sub_file_obj.copy(h5_sub_file_obj[grp_path], main_file_timestamp_dtset_obj)
Я написал другое решение, более компактное и перед копированием проверяет, являются ли исходные объекты группами. См. ниже. Еще одна проверка, которую следует учитывать: конфликты с существующими именами групп в основном (целевом) файле перед копированием каждой группы. Как отмечалось в моем комментарии, рассмотрите возможность использования внешних ссылок, чтобы избежать дублирования данных.
def my_function():
with h5py.File(main_h5_path, mode='a') as h5ft:
if len(h5ft.keys()) == 0:
return
for h5_source in h5_files:
with h5py.File(h5_source,'r') as h5fs:
if len(h5ft.keys()) == 0:
continue
for grp_name, h5_obj in h5fs['SRR6XX/SRR630'].items():
if isinstance(h5_obj,h5py.Group):
# This only creates group:
#h5ft['SRR6XX/SRR630'].create_group(grp_name)
# This copies Group and its objects (groups or datasets):
grp_path = 'SRR6XX/SRR630/' + grp_name
h5fs.copy(h5fs[grp_path], h5ft['SRR6XX/SRR630'])
Хорошо, группы созданы, но пусты. Мне нужно скопировать имена групп вместе с набором данных также внутри групп.
Вам следует уточнить свой вопрос. В нем говорилось, что вы «не хотите перебирать каждый набор данных… просто возьмите группы SRRXX/SRR630/* и добавьте их в основной файл». Тем не менее, легко рекурсивно скопировать группу и связанные с ней объекты. Я изменил свой ответ, чтобы отразить это.
Если у вас много данных, вам следует рассмотреть возможность использования внешних ссылок. Метод 2а в этом посте показывает, как их создавать. Как объединить несколько файлов .h5? Кроме того, здесь описаны все способы копирования данных между файлами H5.
НЕ публикуйте изображения кода, данных, сообщений об ошибках и т. д. — скопируйте или введите текст в вопрос. Изображения не могут быть найдены, скопированы или даже использованы пользователями адаптивных технологий, таких как программы чтения с экрана. Кроме того, воздержитесь от публикации ссылок на определения и/или объяснения проблем. Вместо этого включите объяснение непосредственно в свой вопрос.