Не удалось записать в файл hdf5 - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь создать файл hdf5, но выходной файл пуст.

Я написал код python, который должен работать в l oop и записать строку в созданные наборы данных. После сохранения файла я обнаружил, что выходной файл всегда пуст.

Ниже приведен фрагмент кода, который я написал:

h5_file_name = 'sample.h5'
hf = h5py.File(h5_file_name, 'w')
g1 = hf.create_group('Objects')
dt = h5py.special_dtype(vlen=str)
d1 = g1.create_dataset('D1', (2, 10), dtype=dt)
d2 = g1.create_dataset('D2', (3, 10), dtype=dt)
for i in range(10):
    d1[0][i] = 'Sample'
    d1[1][i] = str(i)
    d2[0][i] = 'Hello'
    d2[1][i] = 'World'
    d2[2][i] = str(i)
hf.close()

Выходной файл пуст, как указано выше.

Может кто-нибудь указать, что мне здесь не хватает, большое спасибо заранее!

Ответы [ 2 ]

2 голосов
/ 11 апреля 2020

Не уверен, как это можно решить с помощью h5py, но если вы не привязаны к определенной библиотеке c, взгляните на HDFql , так как с ней действительно легко работать с файлами HDF5.

Используя HDFql в Python, ваш сценарий использования может быть решен с помощью гиперслабов следующим образом:

import HDFql

HDFql.execute("CREATE FILE sample.h5")

HDFql.execute("USE FILE sample.h5")

HDFql.execute("CREATE CHUNKED(1) DATASET objects/D1 AS VARCHAR(10, 2)")

HDFql.execute("CREATE CHUNKED(1) DATASET objects/D2 AS VARCHAR(10, 3)")

for i in range(10):

    HDFql.execute("INSERT INTO objects/D1(%d:::1) VALUES(Sample, %d)" % (i, i))

    HDFql.execute("INSERT INTO objects/D2(%d:::1) VALUES(Hello, World, %d)" % (i, i))

HDFql.execute("CLOSE FILE")

Дополнительные примеры использования HDFql можно найти здесь .

1 голос
/ 12 апреля 2020

Ваш код работает для меня (в сеансе i python):

In [1]: import h5py                                                                                    
In [2]: h5_file_name = 'sample.h5' 
   ...: hf = h5py.File(h5_file_name, 'w') 
   ...: g1 = hf.create_group('Objects') 
   ...: dt = h5py.special_dtype(vlen=str) 
   ...: d1 = g1.create_dataset('D1', (2, 10), dtype=dt) 
   ...: d2 = g1.create_dataset('D2', (3, 10), dtype=dt) 
   ...: for i in range(10): 
   ...:     d1[0][i] = 'Sample' 
   ...:     d1[1][i] = str(i) 
   ...:     d2[0][i] = 'Hello' 
   ...:     d2[1][i] = 'World' 
   ...:     d2[2][i] = str(i) 
   ...: hf.close()   

Запускается и создает файл. Это не "пусто" в обычном смысле. Но если файл пуст, вы имеете в виду, что он не записал слова в файл? Все, что присутствует, это оригинальный ''.

In [4]: hf = h5py.File(h5_file_name, 'r')                                                              
In [5]: hf['Objects/D1']                                                                               
Out[5]: <HDF5 dataset "D1": shape (2, 10), type "|O">
In [6]: hf['Objects/D1'][:]                                                                            
Out[6]: 
array([['', '', '', '', '', '', '', '', '', ''],
       ['', '', '', '', '', '', '', '', '', '']], dtype=object)

===

Проблема не в настройке файла, а в том, как вы пытаетесь установить элементы:

In [45]: h5_file_name = 'sample.h5' 
    ...: hf = h5py.File(h5_file_name, 'w') 
    ...: g1 = hf.create_group('Objects') 
    ...: dt = h5py.special_dtype(vlen=str) 
    ...: d1 = g1.create_dataset('D1', (2, 10), dtype=dt) 
    ...: d2 = g1.create_dataset('D2', (3, 10), dtype=dt) 
    ...:                                                                                               
In [46]: d1[:]                                                                                         
Out[46]: 
array([['', '', '', '', '', '', '', '', '', ''],
       ['', '', '', '', '', '', '', '', '', '']], dtype=object)
In [47]: d1[0][0] = 'sample'                                                                           
In [48]: d1[:]                                                                                         
Out[48]: 
array([['', '', '', '', '', '', '', '', '', ''],
       ['', '', '', '', '', '', '', '', '', '']], dtype=object)

Используйте стиль индексации tuple:

In [49]: d1[0, 0] = 'sample'                                                                           
In [50]: d1[:]                                                                                         
Out[50]: 
array([['sample', '', '', '', '', '', '', '', '', ''],
       ['', '', '', '', '', '', '', '', '', '']], dtype=object)

С массивом numpy 1017 * работает, но это потому, что d1[0] является view из d1, но h5py (по-видимому) не совсем повторяет это. d1[0] - это копия, фактический массив numpy, а не сам набор данных.

Вариации индексации всего массива:

In [51]: d1[0, :] = 'sample'                                                                           
In [52]: d1[1, :] = np.arange(10)                                                                      
In [53]: d1[:]                                                                                         
Out[53]: 
array([['sample', 'sample', 'sample', 'sample', 'sample', 'sample',
        'sample', 'sample', 'sample', 'sample'],
       ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']], dtype=object)
In [54]: d2[:,0] = ['one','two','three']                                                               
In [55]: d2[:]                                                                                         
Out[55]: 
array([['one', '', '', '', '', '', '', '', '', ''],
       ['two', '', '', '', '', '', '', '', '', ''],
       ['three', '', '', '', '', '', '', '', '', '']], dtype=object)

Проверка изменения типа с помощью индексации:

In [64]: type(d1)                                                                                      
Out[64]: h5py._hl.dataset.Dataset
In [65]: type(d1[0])                                                                                   
Out[65]: numpy.ndarray

d1[0][0]='foobar' изменит этот массив d1[0] без влияния на набор данных d1.

...