在 for 循环中将数据集写入 .hdf5 文件
Issue writing data-sets to an .hdf5 file within a for loop
我正在遍历多个文件并读出我想要的信息,这些信息存储在一个 numpy 数组中,然后我将其写入一个具有唯一名称的 h5py 文件对象(例如 outputdataset_1 , outputdataset_2 . . .),但是当脚本运行时,它只会将最终数据集写入文件(outputdataset_numFiles)。
为了简单起见,所有的文件解析都被抽象为一个 if 循环和函数 "get_data",可以公平有效地假设当代码到达文件末尾时, pts 数据结构包含所有正确的值。
for num in range(1,numFiles):
with h5py.File("outputFileName.hdf5", "w") as f:
with open("fileAddress" +str(num)) as file:
lineNum = 0
while True:
line = file.readline(lineNum)
if not line and lineNum != 0:
s = 'outputdataset_' +str(num)
dset = f.create_dataset(s,pts.shape,data=pts)
break;
if line == criteria:
pts = get_data(pts,line)
lineNum += 1
问题是 for num in range(…)
和 with h5py.File(…)
行的顺序;按照你写的方式,每次加载新文件时都会关闭文件,并且由于 h5py.File()
是使用模式 'w'
调用的,它将(正确地)覆盖 "outputfilename.hdf5"
每个循环。
解决方案:只需切换这些行即可。
或者(但这可能需要更多代码!)您可以使用 "append" 文件模式,即 with h5py.File("outputFileName.hdf5", "a") as f
— 但您可能会 运行 进入 RuntimeError: 'Unable to create link (name already exists)'
如果您 运行 脚本不止一次(迭代)。您 可以 当然可以编写额外的代码来检查 hdf5
文件中的 pre-existing 路径并实现某种 update/replace 逻辑,但这可能需要花点时间写代码。
我正在遍历多个文件并读出我想要的信息,这些信息存储在一个 numpy 数组中,然后我将其写入一个具有唯一名称的 h5py 文件对象(例如 outputdataset_1 , outputdataset_2 . . .),但是当脚本运行时,它只会将最终数据集写入文件(outputdataset_numFiles)。
为了简单起见,所有的文件解析都被抽象为一个 if 循环和函数 "get_data",可以公平有效地假设当代码到达文件末尾时, pts 数据结构包含所有正确的值。
for num in range(1,numFiles):
with h5py.File("outputFileName.hdf5", "w") as f:
with open("fileAddress" +str(num)) as file:
lineNum = 0
while True:
line = file.readline(lineNum)
if not line and lineNum != 0:
s = 'outputdataset_' +str(num)
dset = f.create_dataset(s,pts.shape,data=pts)
break;
if line == criteria:
pts = get_data(pts,line)
lineNum += 1
问题是 for num in range(…)
和 with h5py.File(…)
行的顺序;按照你写的方式,每次加载新文件时都会关闭文件,并且由于 h5py.File()
是使用模式 'w'
调用的,它将(正确地)覆盖 "outputfilename.hdf5"
每个循环。
解决方案:只需切换这些行即可。
或者(但这可能需要更多代码!)您可以使用 "append" 文件模式,即 with h5py.File("outputFileName.hdf5", "a") as f
— 但您可能会 运行 进入 RuntimeError: 'Unable to create link (name already exists)'
如果您 运行 脚本不止一次(迭代)。您 可以 当然可以编写额外的代码来检查 hdf5
文件中的 pre-existing 路径并实现某种 update/replace 逻辑,但这可能需要花点时间写代码。