Как записать файлы hdf5 без перезаписи?

Извините, если это очень простой вопрос о h5py.

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

Я пытаюсь создать несколько наборов данных 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: «Невозможно открыть объект (объект data1 не существует)»

Если я добавляю данные, это требует сначала открытия в режиме '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: невозможно создать ссылку (имя уже существует)

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

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


person ilciavo    schedule 09.08.2015    source источник
comment
Не могли бы вы попробовать перезапустить Python (или ваш IDE), чтобы убедиться, что все файлы закрыты. Я предполагаю, что ваша первая попытка оставила файл открытым, потому что он вышел с исключением.   -  person Daniel    schedule 09.08.2015
comment
То есть вы принципиально не хотите открывать файл в режиме 'a'? Или я неправильно понимаю ваш вопрос?   -  person Anand S Kumar    schedule 09.08.2015
comment
@Daniel Я закрываю файл после получения исключения. Я пытаюсь найти способ использовать одну и ту же строку для записи и добавления данных.   -  person ilciavo    schedule 09.08.2015
comment
@AnandSKumar Я хочу использовать один единственный режим для записи или добавления данных. Это будет вызываться из цикла, и если я использую режим 'a', файл должен быть предварительно открыт в режиме 'w' вне цикла.   -  person ilciavo    schedule 09.08.2015
comment
Нет, если файл, который вы пытаетесь открыть в режиме 'a', ранее не существовал, он создаст файл. Проверьте документацию - a Read/write if exists, create otherwise (default) . Вы всегда можете использовать режим a.   -  person Anand S Kumar    schedule 09.08.2015
comment
@AnandSKumar Если я использую режим 'a', он сообщает мне, что это имя уже существует. Так что я просто удаляю набор данных, файл или есть какой-то другой способ?   -  person ilciavo    schedule 09.08.2015
comment
Если вы хотите создавать уникальный файл при каждом запуске, вам следует подумать о том, чтобы присвоить файлу такое имя, чтобы при каждом запуске вы создавали новый файл (возможно, добавляя к имени отметку времени). Если это невозможно, пытаетесь ли вы удалить файл перед его воссозданием при каждом запуске скрипта?   -  person Anand S Kumar    schedule 09.08.2015
comment
Спасибо, я так и сделаю   -  person ilciavo    schedule 09.08.2015
comment
Хорошо, круто, я добавил ответ для этого.   -  person Anand S Kumar    schedule 09.08.2015


Ответы (1)


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

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

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


Демо -

>>> 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'
person Anand S Kumar    schedule 09.08.2015