2016-03-31 8 views
0

Ich versuche, eine Untergruppe, die ich in einer HDF5-Datei geschrieben habe mit h5py in Python zu löschen. Zum Beispiel nach der Dokumentation, die Untergruppe „MyDataSet“ genannt kann mit gelöscht werden:Löschen Untergruppe von HDF5-Datei in Python

del subgroup["MyDataset"] 

habe ich es und effektiv die Untergruppe ist nicht mehr erreichbar. Die Dateien werden jedoch nicht verkleinert. Meine Frage, ist es möglich, den Speicherplatz von gelöschten Untergruppen mit h5py wiederherzustellen, ohne die restlichen Untergruppen in eine komplett neue Datei umschreiben zu müssen? Im Folgenden werde ich ein kleines Beispiel zu geben, die zeigen, was ich sage:

import numpy as np 
import h5py 

myfile = h5py.File('file1.hdf5') 
data = np.random.rand(int(1e6)) 
myfile.create_dataset("MyDataSet", data=data) 
myfile.close() 

Dann öffne ich die Datei und den vorherigen Eintrag entfernen:

myfile = h5py.File('file1.hdf5') 
del myfile["MyDataSet"] 

und wenn Sie versuchen, die Daten zu erhalten mit:

myfile["MyDataSet"].value 

werden Sie feststellen, dass die Daten nicht mehr zugänglich sind. Wenn Sie jedoch die Größe der Datei überprüfen, bleibt sie vor und nach dem Aufruf von del konstant.

Antwort

3

del myfile["MyDataSet"] modifiziert das File Objekt, aber verändert nicht die zugrunde liegende file1.hdf5 Datei. Die file1.hdf5 Datei wird nicht geändert, bis myfile.close() aufgerufen wird.

Wenn Sie ein with-statement verwenden, wird myfile.close() automatisch für Sie aufgerufen werden, wenn Python lässt die with-statement:

import numpy as np 
import h5py 
import os 

path = 'file1.hdf5' 
with h5py.File(path, "w") as myfile: 
    data = np.random.rand(int(1e6)) 
    myfile.create_dataset("MyDataSet", data=data) 
    print(os.path.getsize(path)) 

with h5py.File(path, "a") as myfile: 
    del myfile["MyDataSet"] 
    try: 
     myfile["MyDataSet"].value 
    except KeyError as err: 
     # print(err) 
     pass 

print(os.path.getsize(path)) 

druckt

8002144   <-- original file size 
2144   <-- new file size 

Beachten Sie, dass das erste Mal, die File Öffnung im Schreibmodus ("w") erstellt eine neue Datei, das zweite Mal, das Öffnen der File i Der Append-Modus ("a", der Standardwert) ermöglicht das Lesen der vorhandenen Datei und ihre Änderung.

+0

Oh. Aha. Ich habe vergessen, die Datei zu schließen. Ich bin eigentlich nicht sehr an die Verwendung von "mit" gewöhnt, aber ich mag die Art und Weise, wie Sie es tun. Solange ich verstehe, wird der With immer den Aufruf der __exit__ Methode erzwingen, was für h5py.File die close() zu sein scheint. Vielen Dank für Ihr schönes Beispiel! – Alejandro

+1

Ja, das stimmt. Die '__exit__' Methode ruft' close() 'auf. "Ab h5py 2.0 müssen Dateien manuell geschlossen werden, indem die Methode" close "aufgerufen oder das Dateiobjekt als Kontextmanager verwendet wird." (aus [Was ist neu in h5py Version 2.0] (http://docs.h5py.org/en/latest/whatsnew/2.0.html)). – unutbu

0

Aus der Dokumentation: http://docs.h5py.org/en/latest/high/file.html#opening-creating-files

Wenn Sie die w Parameter Öffnen der Datei verwenden, sollte die Datei abgeschnitten werden, wenn es geschlossen wird.

myfile = h5py.File('file1.hdf5', 'w') 
+0

Dies ist keine Lösung, da das Öffnen der Datei mit 'w' automatisch alle darin gespeicherten Daten löscht. Versuchen Sie es mit meinem vorherigen Beispiel und Sie werden sehen. – Alejandro

Verwandte Themen