Lesen von HDF5-Dateien in Python


75

Ich versuche, Daten aus der HDF5-Datei in Python zu lesen. Ich kann die hdf5-Datei mit lesen h5py, aber ich kann nicht herausfinden, wie ich auf Daten in der Datei zugreifen kann.

Mein Code

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

Dies funktioniert und die Datei wird gelesen. Aber wie kann ich auf Daten innerhalb des Dateiobjekts zugreifen f1?


1
Wenn die Datei ein Keras-Modell enthält, möchten Sie es wahrscheinlich stattdessen mit Keras laden .
Josiah Yoder

Ist eine hdf5Datei unterscheidet sich von einer hdfDatei? Ich habe hdfs (es sind mehrere Bildbänder), aber ich kann nicht herausfinden, wie ich sie öffnen soll.
Mikey

Antworten:


129

Lesen Sie 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])

Schreiben Sie 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)

Weitere Informationen finden Sie in den h5py-Dokumenten .

Alternativen

Für Ihre Anwendung kann Folgendes wichtig sein:

  • Unterstützung durch andere Programmiersprachen
  • Lese- / Schreibleistung
  • Kompaktheit (Dateigröße)

Siehe auch: Vergleich der Datenserialisierungsformate

Wenn Sie eher nach einer Möglichkeit suchen, Konfigurationsdateien zu erstellen, sollten Sie meinen kurzen Artikel Konfigurationsdateien in Python lesen


2
Um die Daten in den HDF5-Datensätzen als Numpy-Array zu erhalten, können Sie dies tunf[key].value
erickrf

1
Ab h5pyVersion 2.1: "Die Eigenschaft Dataset.value, die auf h5py 1.0 zurückgeht, ist veraltet und wird in einer späteren Version entfernt. Diese Eigenschaft speichert das gesamte Dataset in einem NumPy-Array. Code using .valuesollte aktualisiert werden, um die NumPy-Indizierung mit mydataset[...]oder zu verwenden mydataset[()]wie angemessen."
Honey_Badger

Ich benutze Julias HDF5-Bibliothek und der Lesevorgang ist viel schneller (würde ihn als Antwort einschließen, aber OP hat nach Python gefragt). Das gleiche Lesen der hdf5-Datei dauert in h5py ewig, ist jedoch in Julia sehr überschaubar. Es lohnt sich, das Programmieren in Julia nur für dieses eine Problem zu lernen. Das einzige Problem, das ich mit Julia hatte, war, dass es nullterminierte Zeichenfolgen nicht richtig handhabte, was für mich eine Art Straßensperre war.
Demongolem

Wenn Sie die Antwort selbst kommentieren, führt der Listenvorgang in der gelesenen Version dazu, dass Python einfriert. Wenn ich nur f [a_group_key] mache, funktioniert es mit der richtigen Geschwindigkeit.
Demongolem

@demongolem: Sie sollten nicht die Liste aller Schlüssel verwenden, von denen Sie bereits wissen, welche Sie verwenden möchten. Ich habe es hier getan, um ein in sich geschlossenes Beispiel zu haben, das am wenigsten Arbeit erfordert, um etwas zum Laufen zu bringen.
Martin Thoma

19

Sie können Pandas verwenden.

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

4
Sie sollten sich nicht auf die Pandas-Implementierung verlassen, es sei denn, Sie speichern Datenrahmen. read_hdf setzt voraus, dass sich die HDF-Datei in einer bestimmten Struktur befindet. Außerdem gibt es kein pd.write_hdf, sodass Sie es nur in eine Richtung verwenden können. Siehe diesen Beitrag .
Max

2
Pandas haben eine Schreibfunktion. Siehe pd.DataFrame.to_hdf
Eric Taw

17

Datei lesen

import h5py

f = h5py.File(file_name, mode)

Untersuchen der Struktur der Datei durch Drucken der vorhandenen HDF5-Gruppen

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

Daten extrahieren

#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.Dies kann ersetzt werden durchlist(data)
Hitesh

4
um genaue Struktur mit allen variablen Verwendung zu kennen:data.visit(print)
Hitesh

Nur zu Ihrer Information, das f in h5py.File (...) sollte groß geschrieben werden.
Dannykim

1
@dannykim Fertig.
Daksh

2
Wichtig: data.close()wird am Ende benötigt.
Anilbey

6

Hier ist eine einfache Funktion, die ich gerade geschrieben habe und die eine .hdf5-Datei liest, die von der Funktion save_weights in Keras generiert wurde, und ein Diktat mit Ebenennamen und Gewichten zurückgibt:

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 .

Ich habe es nicht gründlich getestet, mache aber den Job für mich.


Diese Funktion scheint den gesamten Inhalt der .h5-Datei anzuzeigen. Vielen Dank.
minTwin

3

Um den Inhalt der .hdf5-Datei als Array zu lesen, können Sie folgende Schritte ausführen

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

3

Verwenden Sie den folgenden Code, um Daten zu lesen und in ein Numpy-Array umzuwandeln

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
Vergessen Sie nicht, die Datei zu schließen, da sie sonst beschädigt werden kann.
Anilbey

2
from keras.models import load_model 

h= load_model('FILE_NAME.h5')

1
So laden wir ein gespeichertes NN-Modell in Keras. Ich denke, diese Frage ist allgemeiner und hat nichts mit Keras zu tun.
Upul Bandara

Wenn du nur einen Hammer hast, sieht alles aus wie ein Nagel :-).
Upul Bandara

1

Sie müssen lediglich einen Datensatz erstellen. Wenn Sie sich die Kurzanleitung ansehen, sehen Sie, dass Sie das Dateiobjekt verwenden müssen, um ein Dataset zu erstellen. Also, f.create_datasetund dann können Sie die Daten lesen. Dies wird in den Dokumenten erklärt .


0

Mit Hilfe von Antworten aus dieser Frage und dem neuesten Dokument konnte ich meine numerischen Arrays mit extrahieren

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

Wo 'x'ist in meinem Fall einfach die X-Koordinate?


0

Wenn Sie Datensätze in der HDF-Datei benannt haben, können Sie diese Datensätze mit dem folgenden Code lesen und in numpy-Arrays konvertieren:

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

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

Wenn sich Ihre Datei in einem anderen Verzeichnis befindet, können Sie den Pfad vor hinzufügen 'filename.h5'.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.