如何在不覆盖文件的情况下编写HDF5文件?

7

如果这是一个关于 h5py 的非常基础的问题,那么很抱歉。

我在阅读文档,但没有找到类似的示例。

我正在尝试使用Python创建多个hdf5数据集,但事实证明,在关闭文件后数据将被覆盖。

假设我执行以下操作:

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()

运行时错误:无法创建链接(名称已存在)

根据文档,数据应该被连续地存储,但我没有找到如何避免覆盖数据。

如何仅使用一条语句将数据存储在之前关闭的hdf5文件中?


1
所以你基本上不想在'a'模式下打开文件?还是我误解了你的问题? - Anand S Kumar
@Daniel 在捕获异常后,我正在关闭文件。我正在尝试找到一种使用同一行来写入和追加数据的方法。 - ilciavo
@AnandSKumar 我想使用一个单一模式来写入或追加数据。这将从循环中调用,如果我使用 'a' 模式,则文件必须在循环外部以 'w' 模式预先打开。 - ilciavo
1
如果您想在每次运行时创建一个唯一的文件,那么您应该考虑像这样命名文件,以便在每次运行时生成一个新文件(可以在名称中添加时间戳)。如果不可能实现这一点,您是否尝试在脚本的每次运行之前删除文件并重新创建它? - Anand S Kumar
好的,很酷。我已经添加了一个答案。 - Anand S Kumar
显示剩余4条评论
1个回答

2

如果您想在每次运行时创建一个唯一的文件,那么您应该考虑像这样命名文件,例如将时间戳添加到文件名中。一个非常简单的例子是使用datetime模块和nowstrftime方法来创建文件名。示例 -

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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接