这段代码让我工作了几个小时却没有找到解决方案。 该程序在文件中找不到路径,因此它创建了一个新的数据集。然而,它会抛出以下
TypeError()
:
TypeError: "Incompatible object (Dataset) already exists"
如果我尝试通过
dset = file[hdf5_path]
更新值,则会抛出此错误:
Unable to open object (message type not found)
这段代码产生了上面的问题:
hdf5_path = "path/to/my/dataset"
with h5py.File(hdf5_path, "r+") as file:
if hdf5_path in file:
dset = file[hdf5_path]
dset[...] = new_data_set
else:
file.create_dataset(dset_tag, data=pixel_count)
以下代码在循环中第二次生成错误,即创建组“my_path/to_another”:“无法创建组(未找到消息类型)”
import h5py
data_set = [1,2,3,4]
fname = "temp.h5"
h5_path = "my_path"
with h5py.File(fname, "r+") as file:
if h5_path in file:
dset = file[h5_path]
dset[...] = data_set
else:
file.create_dataset(h5_path, data=data_set)
h5_path = "my_path/to_another/dest"
with h5py.File(fname, "r+") as file:
current_path = ""
for part in h5_path.split('/')[:-1]:
current_path = f"{current_path}/{part}" if current_path else part
if current_path not in file:
file.create_group(current_path)
if h5_path in file:
dset = file[h5_path]
dset[...] = data_set
else:
file.create_dataset(h5_path, data=data_set)
会不会是文件损坏了?
两种方法都有错误,因此文件很可能没有损坏。我会解释,然后提供工作代码。
在第一个示例中,您使用
hdf5_path
作为 H5 文件名和数据集路径的名称。此外, create_dataset()
方法引用 dset_tag
作为数据集名称。这些是拼写错误还是剪切粘贴错误?
在第二个示例中,第一个
with/as
块创建一个名为 my_path
的数据集。这会触发第二个 with/as
块中的错误。您正在尝试使用 h5_path = "my_path/to_another/dest"
创建数据集。这意味着 my_path
现在必须是 GROUP(当它刚刚创建为 DATASET 时)。这就是你收到错误的原因。此外,您不需要创建中间组; create_dataset()
方法将为你做到这一点。我将您的索引修改为 h5py 首选格式(从 [...]
到 [()]
,并删除带有 dset = file[h5_path]
的行以减少代码)。
您的代码不会测试现有数据集中数据的修改。我添加了第三段来做到这一点。注意:只有当新数据与现有数据集的类型和形状匹配时,这才有效。如果形状发生变化,或者从整数更改为字符串,您将收到错误。更糟糕的是,如果新数据从整数更改为浮点数,您将收到未检测到的错误,因为浮点数将保存为整数。
修改后的代码如下:
import h5py
data_set = [1,2,3,4]
fname = "temp.h5"
h5_path = "my_path/dest1"
with h5py.File(fname, "r+") as file:
if h5_path in file:
file[h5_path][...] = data_set
else:
file.create_dataset(h5_path, data=data_set)
h5_path = "my_path/dest2"
with h5py.File(fname, "r+") as file:
if h5_path in file:
file[h5_path][...] = data_set
else:
file.create_dataset(h5_path, data=data_set)
data_set = [11,12,13,14]
with h5py.File(fname, "r+") as file:
if h5_path in file:
file[h5_path][()] = data_set
else:
file.create_dataset(h5_path, data=data_set)
print(file[h5_path][()])