2015-07-08 2 views
2

Я хочу использовать файл hdf5 среди некоторых C++, matlab и python. Мой файл h5 хорошо работает в C++ и matlab, но не может быть прочитан с помощью h5py.Чтение или запись составного типа данных с h5py в python

Являются ли типы данных, такие как H5T_STD_B64LE, плохо поддерживаемыми h5py? Спасибо!

In [2]: f = h5py.File('art.mips.log.h5', 'r') 

In [3]: f.keys() 
Out[3]: [u'mem'] 

In [4]: f['mem'] 
Out[4]: <repr(<h5py._hl.dataset.Dataset at 0x29f70d0>) failed: TypeError: No NumPy equivalent for TypeBitfieldID exists> 

Формат hdf5 файла выглядит следующим образом:

$ h5dump -H art.mips.log.h5 
HDF5 "art.mips.log.h5" { GROUP "/" { DATASET "mem" { 
     DATATYPE H5T_COMPOUND { 
     H5T_STD_B64LE "clock"; 
     H5T_STD_B32LE "addr"; 
     H5T_STD_B32LE "operation"; 
     H5T_ARRAY { [16] H5T_STD_B32LE } "data"; 
     } 
     DATASPACE SIMPLE { (68614468)/(H5S_UNLIMITED) } 
     ATTRIBUTE "CLASS" { 
     DATATYPE H5T_STRING { 
      STRSIZE 6; 
      STRPAD H5T_STR_NULLTERM; 
      CSET H5T_CSET_ASCII; 
      CTYPE H5T_C_S1; 
     } 
     DATASPACE SCALAR 
     } 
     ATTRIBUTE "FIELD_0_NAME" { 
     DATATYPE H5T_STRING { 
      STRSIZE 6; 
      STRPAD H5T_STR_NULLTERM; 
      CSET H5T_CSET_ASCII; 
      CTYPE H5T_C_S1; 
     } 
     DATASPACE SCALAR 
     } 
     ATTRIBUTE "FIELD_1_NAME" { 
     DATATYPE H5T_STRING { 
      STRSIZE 5; 
      STRPAD H5T_STR_NULLTERM; 
      CSET H5T_CSET_ASCII; 
      CTYPE H5T_C_S1; 
     } 
     DATASPACE SCALAR 
     } 
     ATTRIBUTE "FIELD_2_NAME" { 
     DATATYPE H5T_STRING { 
      STRSIZE 10; 
      STRPAD H5T_STR_NULLTERM; 
      CSET H5T_CSET_ASCII; 
      CTYPE H5T_C_S1; 
     } 
     DATASPACE SCALAR 
     } 
     ATTRIBUTE "FIELD_3_NAME" { 
     DATATYPE H5T_STRING { 
      STRSIZE 5; 
      STRPAD H5T_STR_NULLTERM; 
      CSET H5T_CSET_ASCII; 
      CTYPE H5T_C_S1; 
     } 
     DATASPACE SCALAR 
     } 
     ATTRIBUTE "TITLE" { 
     DATATYPE H5T_STRING { 
      STRSIZE 4; 
      STRPAD H5T_STR_NULLTERM; 
      CSET H5T_CSET_ASCII; 
      CTYPE H5T_C_S1; 
     } 
     DATASPACE SCALAR 
     } 
     ATTRIBUTE "VERSION" { 
     DATATYPE H5T_STRING { 
      STRSIZE 4; 
      STRPAD H5T_STR_NULLTERM; 
      CSET H5T_CSET_ASCII; 
      CTYPE H5T_C_S1; 
     } 
     DATASPACE SCALAR 
     } 
    } 
} 
} 
+0

Было бы проще, чтобы обсудить это, если вы предоставили образец .h5 файл (или, по крайней мере, включен конфигурационный файл для h5import, чтобы сделать его легко иметь образец набора данных, чтобы экспериментировать с, см https: // WWW .hdfgroup.org/HDF5/Репетитор/cmdtoolcvrt.html # h5import). – Phil

+0

@Phil Это пример файла со всем [одним приводом] (http://1drv.ms/1gtnfiB). На самом деле я вставил один и тот же вопрос в [h5py mail list] (https://groups.google.com/forum/#!topic/h5py/qBkiLEO40aY), а andrew предлагает мне делать кастинг типов. Я не пробовал, и мне также интересно, как я могу написать файл h5 с помощью python в том же формате, поэтому другие исходные коды могут читать его без каких-либо модификаций кода. – richie

+0

Ваш вопрос ясен, но я не знаю ответа. Я попытался использовать астип, как предложил Эндрю в списке рассылки, и получил «IOError: невозможно прочитать данные (нет соответствующей функции для пути преобразования)». Если вы можете изменить автора, я предлагаю вам упаковать данные в значения uint8, а не в биты. – Phil

ответ

0

h5py не поддерживает битовые поля, как указано в https://github.com/h5py/h5py/issues/109

У меня был быстрый взгляд на интерфейс низкого уровня в h5py к посмотрите, есть ли способ получить необработанные данные, но похоже, что базовый объект id должен поддерживать метод read().

>>> mem_id = h5py.h5o.get_info(f.id, 'mem') 
>>> mem_id.read 
... 
AttributeError: 'h5py.h5o.ObjInfo' object has no attribute 'read' 
+0

Правильно, пока нет хорошего решения. Я просто изменю автора, чтобы избежать этой проблемы. – richie

Смежные вопросы