Как объединить несколько файлов H5 в один файл H5 с помощью Python и h5py?

Я новичок в кодировании 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

НЕ публикуйте изображения кода, данных, сообщений об ошибках и т. д. — скопируйте или введите текст в вопрос. Изображения не могут быть найдены, скопированы или даже использованы пользователями адаптивных технологий, таких как программы чтения с экрана. Кроме того, воздержитесь от публикации ссылок на определения и/или объяснения проблем. Вместо этого включите объяснение непосредственно в свой вопрос.

itprorh66 04.05.2024 19:00

Перехват исключения затрудняет определение места возникновения проблемы. try/except подобное позволяет вам по-новому интерпретировать ошибку для ваших пользователей, но не помогает отслеживать ошибки. Проблема может быть в том, как вы составляете group имена.

hpaulj 04.05.2024 19:04

Модераторы, ОП изменил сообщение, добавив код, и удалил изображение кода. Вопрос действителен и полезен для пользователей HDF5/h5py. Пожалуйста, рассмотрите возможность возобновления работы.

kcw78 07.05.2024 16:30

@ kcw78 1) нет вопросов, 2) они упоминают получение исключений, но в пост никаких исключений не включено.

Mark Rotteveel 07.05.2024 18:46

Я изменил сообщение, чтобы преобразовать подразумеваемую проблему в вопрос. Также добавлен текстовый вывод исключения. (Кстати, это исключение в опубликованном коде.)

kcw78 09.05.2024 14:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мой исходный ответ копировал только имена групп из группы '/SRR6XX/SRR630' в исходных файлах в основной (целевой) файл. ОП прокомментировал, что они хотят «скопировать имена групп вместе с их наборами данных». Я обновил свой ответ, чтобы отразить этот запрос. Требуется всего лишь изменение 1 строки. (Для справки, строка создания групп закомментирована.)

Вот изменения в исходном коде, необходимые для того, чтобы это заработало:

  1. Для добавления новых объектов основной (целевой) файл должен быть открыт в режиме добавления.
  2. ts_key в вашем цикле — это имя объекта (а не объект). Используйте .items() для получения имен и объектов (или просто ссылайтесь на объект по имени).
  3. Вы создаете новый объект в основном (целевом) файле на корневом уровне. Вам необходимо изменить ссылку на соответствующий групповой объект (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'])

Хорошо, группы созданы, но пусты. Мне нужно скопировать имена групп вместе с набором данных также внутри групп.

Sayan Bera 05.05.2024 17:03

Вам следует уточнить свой вопрос. В нем говорилось, что вы «не хотите перебирать каждый набор данных… просто возьмите группы SRRXX/SRR630/* и добавьте их в основной файл». Тем не менее, легко рекурсивно скопировать группу и связанные с ней объекты. Я изменил свой ответ, чтобы отразить это.

kcw78 06.05.2024 20:29

Если у вас много данных, вам следует рассмотреть возможность использования внешних ссылок. Метод 2а в этом посте показывает, как их создавать. Как объединить несколько файлов .h5? Кроме того, здесь описаны все способы копирования данных между файлами H5.

kcw78 06.05.2024 20:38

Другие вопросы по теме