如何在Python中读取HDF5文件


79

我正在尝试从Python中的hdf5文件读取数据。我可以使用读取hdf5文件h5py,但无法弄清楚如何访问文件中的数据。

我的密码

import h5py    
import numpy as np    
f1 = h5py.File(file_name,'r+')    

这可以正常工作并读取文件。但是,如何访问文件对象内部的数据f1


1
如果文件包含Keras模型,则您可能想用Keras加载它
Josiah Yoder

hdf5从一个文件中的不同hdf文件?我有hdf(它们有几个图像带),但是我不知道如何打开它们。
mikey

Answers:


132

读取HDF5

import h5py
filename = "file.hdf5"

with h5py.File(filename, "r") as f:
    # List all groups
    print("Keys: %s" % f.keys())
    a_group_key = list(f.keys())[0]

    # Get the data
    data = list(f[a_group_key])

写HDF5

import h5py

# Create random data
import numpy as np
data_matrix = np.random.uniform(-1, 1, size=(10, 3))

# Write data to HDF5
with h5py.File("file.hdf5", "w") as data_file:
    data_file.create_dataset("group_name", data=data_matrix)

有关更多信息,请参见h5py docs

备择方案

对于您的应用程序,以下内容可能很重要:

  • 其他编程语言的支持
  • 阅读/写作表现
  • 紧凑度(文件大小)

另请参阅:数据序列化格式的比较

如果您想寻找一种制作配置文件的方法,则可能需要阅读我的短文《Python中的配置文件》。


2
要以numpy数组的形式获取HDF5数据集中的数据,可以执行f[key].value
erickrf

1
h5py2.1版开始:“该属性Dataset.value可追溯至h5py 1.0,已弃用,并将在以后的版本中删除。此属性将整个数据集转储到NumPy数组中。.value应使用mydataset[...]或将代码更新为使用NumPy索引。mydataset[()]作为适当的。”
honey_badger

我正在使用Julia的hdf5库,读操作要快得多(将其包含在内作为答案,但OP要求使用python)。相同的hdf5文件读取将永远用在h5py中,但是在Julia中它是非常易于管理的,值得学习在Julia中编程以解决这一问题。我对Julia的唯一问题是,它不能正确处理以null结尾的字符串,这对我来说有点障碍。
demongolem

评论答案本身,读取版本中的列表操作会导致python冻结。如果我只是执行f [a_group_key],它就会以适当的速度运行。
demongolem

@demongolem:您不应使用已经知道要使用的所有密钥的列表。我在这里做了一个完整的示例,它需要最少的工作来运行某些东西。
Martin Thoma

21

读取文件

import h5py

f = h5py.File(file_name, mode)

通过打印存在的HDF5组来研究文件的结构

for key in f.keys():
    print(key) #Names of the groups in HDF5 file.

提取数据

#Get the HDF5 group
group = f[key]

#Checkout what keys are inside that group.
for key in group.keys():
    print(key)

data = group[some_key_inside_the_group].value
#Do whatever you want with data

#After you are done
f.close()

for key in data.keys(): print(key) #Names of the groups in HDF5 file.可以替换为list(data)
Hitesh 18'Apr 19'7

4
知道使用所有变量的确切结构:data.visit(print)
Hitesh

只是fyi,h5py.File(...)中的f应该大写。
dannykim '18年

1
@dannykim完成。
Daksh '18年

2
重要提示:data.close()最后需要。
anilbey

19

您可以使用熊猫。

import pandas as pd
pd.read_hdf(filename,key)

4
除非要存储数据帧,否则不应依赖Pandas实现。read_hdf依赖于HDF文件具有特定的结构;也没有pd.write_hdf,因此您只能单向使用它。看到这篇文章
最多

2
熊猫确实具有书写功能。参见pd.DataFrame.to_hdf
Eric Taw

7

这是我刚刚编写的一个简单函数,它读取由keras中的save_weights函数生成的.hdf5文件,并返回包含图层名称和权重的字典:

def read_hdf5(path):

    weights = {}

    keys = []
    with h5py.File(path, 'r') as f: # open file
        f.visit(keys.append) # append all keys to list
        for key in keys:
            if ':' in key: # contains data if ':' in key
                print(f[key].name)
                weights[f[key].name] = f[key].value
    return weights

https://gist.github.com/Attila94/fb917e03b04035f3737cc8860d9e9f9b

尚未进行全面测试,但可以为我完成工作。


此功能似乎显示.h5文件中的所有内容。谢谢。
minTwin

4

要将.hdf5文件的内容作为数组读取,可以执行以下操作

> import numpy as np 
> myarray = np.fromfile('file.hdf5', dtype=float)
> print(myarray)

4

使用以下代码读取数据并将其转换为numpy数组

import h5py
f1 = h5py.File('data_1.h5', 'r')
list(f1.keys())
X1 = f1['x']
y1=f1['y']
df1= np.array(X1.value)
dfy1= np.array(y1.value)
print (df1.shape)
print (dfy1.shape)

1
不要忘记关闭文件,否则文件可能会损坏。
anilbey

谢谢。这可能是打开.hdf5数据文件的最佳方法。
法扎德·阿米尔贾维德

2
from keras.models import load_model 

h= load_model('FILE_NAME.h5')

1
这就是我们在Keras中加载保存的NN模型的方式。我认为这个问题更笼统,并且与Keras有关。
Upul Bandara

1
当您拥有的只是一把锤子时,一切看起来都像钉子:-)。
Upul Bandara

1

您需要做的是创建一个数据集。如果您查看快速入门指南,它将显示您需要使用文件对象来创建数据集。这样,f.create_dataset您就可以读取数据了。在docs中对此进行了解释。


0

使用该问题的答案和最新文档,我能够使用以下方法提取数值数组

import h5py
with h5py.File(filename, 'r') as h5f:
    h5x = h5f[list(h5f.keys())[0]]['x'][()]

'x'在我的情况下,X坐标仅在哪里。


0

如果在hdf文件中命名了数据集,则可以使用以下代码读取并转换为numpy数组的这些数据集:

import h5py
file = h5py.File('filename.h5', 'r')

xdata = file.get('xdata')
xdata= np.array(xdata)

如果文件位于其他目录中,则可以在前面添加路径'filename.h5'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.