2016-03-31 25 views
0

Pythonでh5pyを使用してHDF5ファイルに書き込んだサブグループを削除しようとしています。たとえば、ドキュメントによると、「MyDataset」と呼ばれるサブグループを削除することができます。PythonのHDF5ファイルからサブグループを削除

del subgroup["MyDataset"] 

私はそれをやったし、効果的にサブグループにはアクセスできません長いです。ただし、ファイルのサイズは縮小されません。私の質問は、完全に新しいファイルに残りのサブグループを書き換えることなく、h5pyを使って削除されたサブグループからスペースを回復することは可能ですか?その後

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() 

私は、ファイルを開いて、以前のエントリを削除:

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

を、あなたが使用してデータを取得しようとする場合:私は小さな例を提供下に私が言っているものを示している

myfile["MyDataSet"].value 

あなたは、データにアクセスできなくなったことに気付きます。ただし、ファイルのサイズを確認すると、delの呼び出し前後で一定のままです。ドキュメントから

答えて

3

del myfile["MyDataSet"]Fileオブジェクトを変更しますが、根本的なfile1.hdf5ファイルを変更しません。ファイルmyfile.close()まで変更されていないfile1.hdf5ファイルが呼び出されます。

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

印刷物初めて、Fileを開くこと

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

注意:with-statement使用している場合は、Pythonがwith-statementを離れるとき

myfile.close()はあなたのために自動的に呼び出されます書き込みモード("w")で新しいファイルを作成し、2度目はFile iを開きますn追加モード("a"、デフォルト)では、既存のファイルを読み込んで変更することができます。

+0

ああそうですか。私はファイルを閉じるのを忘れた。私は実際には "with"の使用にあまり慣れていませんが、あなたがそれをやる方法は本当に好きです。私が理解している限り、withは常に__exit__メソッドの呼び出しを強制します。これはh5py.Fileではclose()と思われます。あなたの素晴らしい例をありがとうございました! – Alejandro

+1

はい、そうです。 '__exit__'メソッドは' close() 'を呼び出します。 "h5py 2.0以降、ファイルを手動で閉じるには、" close "メソッドを呼び出すか、ファイルオブジェクトをコンテキストマネージャーとして使用する必要があります。" ([h5pyバージョン2.0の新機能](http://docs.h5py.org/ja/latest/whatsnew/2.0.html)から)。 – unutbu

0

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

あなたがファイルを開くワットパラメータを使用している場合は、それを閉じるときに、ファイルが切り捨てされなければなりません。

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

これは解決策ではありません。「w」を使用してファイルを開くと、そのファイルに格納されているすべてのデータが自動的に削除されるためです。私の前の例でそれをやってみるとあなたが表示されます。 – Alejandro

関連する問題