【问题标题】:TypeError: 'NoneType' object is not iterable (h5 file)TypeError:“NoneType”对象不可迭代(h5 文件)
【发布时间】:2018-11-29 22:24:47
【问题描述】:

我正在与 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']

【问题讨论】:

  • 您可以从这里Quick Start With h5py 快速了解 h5py 模块
  • 请创建一个最小的完整可验证示例以及 exact 错误。
  • 您要我们猜测错误在哪一行吗?了解如何创建minimal reproducible example
  • 我猜 hdf.get("train_happy.h5")hdf2.get("test_happy.h5") 正在返回 None,而您正在尝试转换为 list
  • print(list(hdf.keys())) 给你什么?编辑问题,我不是来聊天的。

标签: python jpeg h5py file-conversion


【解决方案1】:

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

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

train_happy.h5HDF5 文件的名称。您需要在 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 的 cmets 修改]

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 所示。

【讨论】:

  • 对于数据集名称,array_x = hdf['train_set_x'][:] 应该是加载数组所需的全部内容。 hdfgroups 的行为类似于 Python 字典。数据集索引类似于 numpy 数组。
  • @hpaulj。好点子。谢谢。我很着急,只是简单地复制了 OPs 代码(我感到羞耻)。我将修改我的示例以反映您的 cmets
猜你喜欢
  • 2012-08-25
  • 1970-01-01
  • 2017-08-29
  • 2016-08-30
  • 2014-11-21
  • 1970-01-01
相关资源
最近更新 更多