TypeError: 'NoneType' object is not iterable (h5 file)

TypeError: 'NoneType' object is not iterable (h5 file)

我正在与 python 为一个学校项目而战。我从 复制并粘贴了一些代码,仅更改了变量名称。我正在尝试将两个文件从 h5 转换为 jpg。这是我的代码:

import h5py
import numpy as np
from PIL import Image

hdf = h5py.File("train_happy.h5",'r')
array = np.array(list(hdf.get("train_happy.h5")))
img = Image.fromarray(array.astype('uint8'), 'RGB')
img.save("train_happy.jpg", "JPEG")

hdf2 = h5py.File("test_happy.h5",'r')
array = np.array(list(hdf2.get("test_happy.h5")))
img = Image.fromarray(array.astype('uint8'), 'RGB')
img.save("test_happy.jpg", "JPEG")

training = 'train_happy.jpg'
testing = 'test_happy.jpg'

我对 h5 文件或使用 python 转换文件一无所知。请帮忙!

编辑:这是错误所在的行:

array = np.array(list(hdf.get("train_happy.h5")))

如果非要我猜的话,我会说这一行会发生同样的错误:

array = np.array(list(hdf2.get("test_happy.h5")))

另外,命令:

print(list(hdf.keys()))

给我这个输出:

['list_classes', 'train_set_x', 'train_set_y']

查看您 linked post 中的示例! 您的初始错误是:

array = np.array(list(hdf.get("train_happy.h5")))

train_happy.h5HDF5 文件的名称。您需要在 HDF5 文件中使用图像数据集 的 名称(使用 group/dataset 命名法)。 list(hdf.keys()) 的输出表明您在根级别有 3 个节点。每个节点要么是一个组,要么是一个数据集(图像)。不知道你到底有什么,很难写下一个步骤。理想情况下,您将使用 .isinstance() 来获取节点类型。下面提供了一个非常简单的示例来遍历您的节点名称:

for node in list(hdf.keys()) :
    print ('working on node %s' % node)
    object = hdf[node]
    if (isinstance(object, h5py.Group)):
        print ('%s is a Group' % node )
    elif (isinstance(object, h5py.Dataset)):
        print ('%s is a Dataset' % node )

或者,您可以简单地破解并尝试这个(适当调整下游代码):[根据 hpaulj 的评论修改下面的代码]

array_x = hdf.get["train_set_x"][:]
array_y = hdf.get["train_set_y"][:]

上面的代码假定 train_set_xtrain_set_y 是图像数据集(类似于 link 中的 "Photos/Image 1")。

此外,您不需要第二个 hdf2 声明 (hdf2 = h5py.File("test_happy.h5",'r')) 来处理第二个图像。您可以每次重复使用 hdf,并更改 Group/Dataset 引用的名称,如上文 array_y 所示。