TypeError:“ NoneType”对象不可迭代(H5文件)

时间:2018-11-28 21:46:59

标签: python jpeg h5py file-conversion

我正在与python争夺一个学校项目。我从this post,复制并粘贴了一些代码,仅更改了变量名。我正在尝试将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']

1 个答案:

答案 0 :(得分:1)

在链接的帖子中查看示例! 您的最初错误是这样的:

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

train_happy.h5是HDF5文件的名称。您需要使用HDF5文件中的图像数据集名称(使用组/数据集命名法)。 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是图像数据集(类似于链接中的"Photos/Image 1")。

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