【问题标题】:Issue writing data-sets to an .hdf5 file within a for loop在 for 循环中将数据集写入 .hdf5 文件的问题
【发布时间】:2019-05-16 13:47:21
【问题描述】:

我正在遍历多个文件并读出我想要的信息,这些信息被存储在一个 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

【问题讨论】:

  • 您打开(并覆盖)每个输入文件的输出文件。您读取了一个非空行并将值放入pts。但你对此无能为力。您不应该从多行收集值吗?仅写入最后一个 pts 值。我认为您需要练习一个更简单的案例,您可以详细了解迭代。
  • 我的错误我将代码简化了一点,我可以向您保证,从文件中收集的数据工作正常。我现在将编辑示例。

标签: python file h5py


【解决方案1】:

问题在于for num in range(…)with h5py.File(…) 行的顺序;按照您编写的方式,每次加载新文件时都会关闭文件,并且由于h5py.File()'w' 模式调用,因此它将(正确)在每个循环中覆盖"outputfilename.hdf5"

解决方案:只需切换这些行。

或者(但这可能需要更多代码!)您可以使用“附加”文件模式,即with h5py.File("outputFileName.hdf5", "a") as f — 但如果您多次(迭代地)运行脚本,您可能会遇到RuntimeError: 'Unable to create link (name already exists)'。您当然可以编写额外的代码来检查hdf5 文件中的预先存在的路径并实现某种更新/替换逻辑,但这可能需要一些时间来编写代码。

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 2021-05-13
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多