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.h5
是 HDF5 文件的名称。您需要在 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_x
和 train_set_y
是图像数据集(类似于 link 中的 "Photos/Image 1"
)。
此外,您不需要第二个 hdf2 声明 (hdf2 = h5py.File("test_happy.h5",'r')
) 来处理第二个图像。您可以每次重复使用 hdf
,并更改 Group/Dataset 引用的名称,如上文 array_y
所示。
我正在与 python 为一个学校项目而战。我从
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.h5
是 HDF5 文件的名称。您需要在 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_x
和 train_set_y
是图像数据集(类似于 link 中的 "Photos/Image 1"
)。
此外,您不需要第二个 hdf2 声明 (hdf2 = h5py.File("test_happy.h5",'r')
) 来处理第二个图像。您可以每次重复使用 hdf
,并更改 Group/Dataset 引用的名称,如上文 array_y
所示。