2015-08-09 4 views
4

Извините, если это очень простой вопрос на h5py.Как написать hdf5 файлы без перезаписи?

Я читал документацию, но не нашел подобного примера.

Я пытаюсь создать несколько наборов данных hdf5 на Python, но, оказывается, после закрытия файла данные будут перезаписаны.

Допустим, я делаю следующее:

import numpy as np 
import h5py 
f = h5py.File('test.hdf5', 'w') 
f.create_dataset('data1', data = np.ones(10)) 
f.close() 
f = h5py.File('test.hdf5', 'w') 
f.create_dataset('data0', data = np.zeros(10)) 
f.close() 
f = h5py.File('test.hdf5', 'r') 
f["data1"].value 
f.close() 

Я получаю

KeyError: "Unable to open object (Object 'data1' doesn't exist)"

Если я добавить данные, которые требуется первое отверстие в режиме 'w', а затем добавление в режиме 'a', имея два разных заявления ,

import numpy as np 
import h5py 
f = h5py.File('test.hdf5', 'w') 
f.create_dataset('data1', data = np.ones(10)) 
f.close() 
f = h5py.File('test.hdf5', 'a') 
f.create_dataset('data0', data = np.zeros(10)) 
f.close() 
f = h5py.File('test.hdf5', 'r') 
f["data1"].value 
f.close() 

Если открыть файл в режиме 'a' в обоих случаях:

import numpy as np 
import h5py 
f = h5py.File('test.hdf5', 'a') 
f.create_dataset('data1', data = np.ones(10)) 
f.close() 
f = h5py.File('test.hdf5', 'a') 
f.create_dataset('data0', data = np.zeros(10)) 
f.close() 
f = h5py.File('test.hdf5', 'r') 
print(f['data1'].value) 
f.close() 

RuntimeError: Unable to create link (Name already exists)

Согласно документации, данные должны храниться смежно, но я не нашел, как избежать перезаписи данные.

Как хранить данные на ранее закрытом hdf5 только с помощью одного заявления?

+0

Может попробовать перезапустить питон (или ваш IDE), чтобы убедиться, что все файлы закрыты. Я предполагаю, что ваша первая попытка оставила файл открытым, потому что он вышел из исключения. – Daniel

+0

Итак, вы в основном не хотите открывать файл в '' a'' режиме? Или я понимаю вас неправильно? –

+0

@ Daniel Я закрываю файл после получения исключения. Я пытаюсь найти способ использовать одну и ту же строку для записи и добавления данных. – ilciavo

ответ

2

Если вы хотите создать уникальный файл в каждом прогоне, то вам следует подумать об именовании такого файла, примером может быть добавление метки времени к имени файла. Очень простой пример - использовать datetime модуль и now и strftime метод для создания имени файла. Пример -

import datetime 
filename = "test_{}.hdf5".format(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")) 

Затем вы можете использовать это имя файла, чтобы открыть файл.


Demo -

>>> import datetime 
>>> filename = "test_{}.hdf5".format(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")) 
>>> filename 
'test_2015_08_09_13_33_43.hdf5'