Combina todos los archivos h5 usando h5py

Soy novato en la encoding. ¿Puede alguien ayudarme con un script en Python usando h5py en donde podemos leer todos los directorios y subdirectorios para fusionar varios archivos h5 en un solo archivo h5?

Lo que necesita es una lista de todos los conjuntos de datos en el archivo. Creo que la noción de una función recursiva es lo que se necesita aquí. Esto le permitiría extraer todos los ‘conjuntos de datos’ de un grupo, pero cuando uno de ellos parece ser un grupo en sí mismo, recursivamente haga lo mismo hasta que se encuentren todos los conjuntos de datos. Por ejemplo:

/ |- dataset1 |- group1 |- dataset2 |- dataset3 |- dataset4 

Su función en pseudocódigo debería ser:

 def getdatasets(key, file): out = [] for name in file[key]: path = join(key, name) if file[path] is dataset: out += [path] else out += getdatasets(path, file) return out 

Para nuestro ejemplo:

  1. /dataset1 es un conjunto de datos: agregar ruta a la salida, dando

     out = ['/dataset1'] 
  2. /group no es un conjunto de datos: llamada getdatasets('/group',file)

    1. /group/dataset2 es un conjunto de datos: agregar ruta a la salida, dando

       nested_out = ['/group/dataset2'] 
    2. /group/dataset3 es un conjunto de datos: agregar ruta a la salida, dando

       nested_out = ['/group/dataset2', '/group/dataset3'] 

    Esto se sum a lo que ya teníamos:

     out = ['/dataset1', '/group/dataset2', '/group/dataset3'] 
  3. /dataset4 es un conjunto de datos: agregar ruta a la salida, dando

     out = ['/dataset1', '/group/dataset2', '/group/dataset3', '/dataset4'] 

Esta lista se puede utilizar para copiar todos los datos a otro archivo.


Para hacer un clon simple puedes hacer lo siguiente.

 import h5py import numpy as np # function to return a list of paths to each dataset def getdatasets(key,archive): if key[-1] != '/': key += '/' out = [] for name in archive[key]: path = key + name if isinstance(archive[path], h5py.Dataset): out += [path] else: out += getdatasets(path,archive) return out # open HDF5-files data = h5py.File('old.hdf5','r') new_data = h5py.File('new.hdf5','w') # read as much datasets as possible from the old HDF5-file datasets = getdatasets('/',data) # get the group-names from the lists of datasets groups = list(set([i[::-1].split('/',1)[1][::-1] for i in datasets])) groups = [i for i in groups if len(i)>0] # sort groups based on depth idx = np.argsort(np.array([len(i.split('/')) for i in groups])) groups = [groups[i] for i in idx] # create all groups that contain dataset that will be copied for group in groups: new_data.create_group(group) # copy datasets for path in datasets: # - get group name group = path[::-1].split('/',1)[1][::-1] # - minimum group name if len(group) == 0: group = '/' # - copy data data.copy(path, new_data[group]) 

Por supuesto, otras personalizaciones son posibles dependiendo de lo que quieras. Usted describe alguna combinación de archivos. En ese caso tendrías que

  new_data = h5py.File('new.hdf5','a') 

y probablemente añadir algo al camino.