【问题标题】:How to write hdf5 files without overwriting?如何在不覆盖的情况下写入 hdf5 文件?
【发布时间】:2019-02-18 02:30:11
【问题描述】:

对不起,如果这是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()

RuntimeError: 无法创建链接(名称已存在)

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

如何仅使用一条语句将数据存储在先前关闭的 hdf5 上?

【问题讨论】:

  • 您能否尝试重新启动 python(或您的 ide)以确保所有文件都已关闭。我假设您的第一次尝试使文件保持打开状态,因为它以异常退出。
  • 所以你基本上不想在'a'模式下打开文件?还是我理解错了你的问题?
  • @Daniel 我收到异常后正在关闭文件。我正在尝试找到一种方法来使用同一行来写入和附加数据。
  • @AnandSKumar 我想使用一种单一模式来写入或附加数据。这将从循环中调用,如果我使用'a' 模式,则必须先前在循环外以'w' 模式打开文件。
  • 如果你想在每次运行中创建一个唯一的文件,那么你应该考虑这样命名文件,这样在每次运行中你都会生成一个新文件(可能会在名称中添加一个时间戳)。如果这不可能,您是否尝试在每次运行脚本重新创建文件之前删除该文件?

标签: python h5py


【解决方案1】:

如果你想在每次运行中创建一个唯一的文件,那么你应该考虑这样命名文件,一个例子是在文件名中添加时间戳,一个非常简单的例子是使用@987654321 @module 和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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 2020-10-06
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多