how - Almacenamiento de una lista de cadenas en un conjunto de datos HDF5 de Python
how to update h5py (3)
En HDF5, los datos en formato VL se almacenan como vectores de longitud arbitraria de un tipo base. En particular, las cadenas se almacenan en estilo C en búferes terminados en nulo. NumPy no tiene un mecanismo nativo para soportar esto. Desafortunadamente, este es el estándar de facto para representar cadenas en la API HDF5 C y en muchas aplicaciones HDF5.
Afortunadamente, NumPy tiene un tipo de puntero genérico en la forma del tipo de "objeto" ("O"). En h5py, las cadenas de longitud variable se asignan a matrices de objetos. Una pequeña cantidad de metadatos adjuntos a un tipo de "O" le dice a h5py que su contenido se debe convertir a cadenas VL cuando se almacena en el archivo.
Las cadenas VL existentes se pueden leer y escribir sin ningún esfuerzo adicional; Las cadenas Python y las cadenas NumPy de longitud fija se pueden convertir automáticamente a datos VL y almacenar.
Ejemplo
In [27]: dt = h5py.special_dtype(vlen=str)
In [28]: dset = h5File.create_dataset(''vlen_str'', (100,), dtype=dt)
In [29]: dset[0] = ''the change of water into water vapour''
In [30]: dset[0]
Out[30]: ''the change of water into water vapour''
Estoy tratando de almacenar una lista de longitud variable de cadena en un conjunto de datos HDF5. El código para esto es
import h5py
h5File=h5py.File(''xxx.h5'',''w'')
strList=[''asas'',''asas'',''asas'']
h5File.create_dataset(''xxx'',(len(strList),1),''S10'',strList)
h5File.flush()
h5File.Close()
Recibo un error que indica que "TypeError: No hay ruta de conversión para dtype: dtype (''& lt U3'')" donde & lt significa real menos que el símbolo
Como puedó resolver esté problema.
Estás leyendo en cadenas Unicode, pero especificando tu tipo de datos como ASCII. Según la wiki de h5py , h5py no admite esta conversión actualmente.
Tendrá que codificar las cadenas en un formato de manejadores h5py:
asciiList = [n.encode("ascii", "ignore") for n in strList]
h5File.create_dataset(''xxx'', (len(asciiList),1),''S10'', asciiList)
Nota: ¡no todo lo codificado en UTF-8 puede codificarse en ASCII!
Me encuentro en una situación similar que desea almacenar los nombres de columna de dataframe como un conjunto de datos en un archivo hdf5. Suponiendo que df.columns es lo que quiero almacenar, encontré los siguientes trabajos:
h5File = h5py.File(''my_file.h5'',''w'')
h5File[''col_names''] = df.columns.values.astype(''S'')
Esto supone que los nombres de las columnas son cadenas "simples" que pueden codificarse en ASCII.