3

hdf5開いて適切な値を新しい辞書に読み込み、最終的にテキスト ファイルに書き込みたいファイルのリストがあります。私は必ずしも値を知っているわけではないので、ユーザーはそれらをコードへの入力として配列で定義します。必要なファイルの数は、ユーザーが見たいデータの日数によって決まります。

new_data_dic = {}

for j in range(len(values)):
    new_data_dic[values[j]] = rbsp_ephm[values[j]]
for i in (np.arange(len(filenames_a)-1)+1):
        rbsp_ephm = h5py.File(filenames_a[i])
        for j in range(len(values)):
            new_data_dic[values[j]].append(rbsp_ephm[values[j]])

ファイルが 1 つしかない場合は問題なく動作しますが、ファイルが 2 つ以上ある場合はキーが閉じているように見えますか? これが正確に起こっていることかどうかはわかりませんが、何が起こっているのかを尋ねると、テキストファイルに書き込まれないnew_data_dic値が返されます。{'Bfs_geo_a': <Closed HDF5 dataset>,...次の ( ) を開く前に hdf5 ファイルを閉じようとしましたrbsp_ephm.close()が、同じエラーが発生します。

助けてくれてありがとう!

4

2 に答える 2

1

私はあなたの問題を本当に理解していません...あなたはhdf5データセットのリストを作成しようとしていますか?[()]または、データセット自体の値にアクセスすることを忘れましたか?

これは、問題なく機能する単純なスタンドアロンの例です。

import h5py

# File creation 
filenames_a = []
values = ['values/toto', 'values/tata', 'values/tutu']

nb_file = 5
tmp = 0
for i in range(nb_file):
    fname = 'file%s.h5' % i
    filenames_a.append(fname)
    file = h5py.File(fname, 'w')
    grp = file.create_group('values')
    for value in values:
        file[value] = tmp
        tmp += 1
    file.close()

# the thing you want
new_data_dict = {value: [] for value in values}

for fname in filenames_a:
    rbsp_ephm = h5py.File(fname, 'r')
    for value in values:
        new_data_dict[value].append(rbsp_ephm[value][()])

print new_data_dict

戻ります:

{'values/tutu': [2, 5, 8, 11, 14], 'values/toto': [0, 3, 6, 9, 12], 'values/tata': [1, 4, 7, 10, 13]}

それはあなたの質問に答えますか?

于 2012-11-27T14:05:22.593 に答える
0

直接的には良い解決策ではないかもしれませんが、h5py データセット形式ではなく、より柔軟な形式である numpy 配列としてデータを抽出することを試みることができます。以下の方法を参照してください。

>>> print type(file['Average/u'])
<class 'h5py.highlevel.Dataset'>
>>> print type(file['Average/u'][:])
<type 'numpy.ndarray'>

念のため、ループにはより「pythonic」な方法を使用するようにしてください。つまり、次のようになります。

for j in values:
    new_data_dic[j] = rbsp_ephm[j]

それ以外の:

for j in range(len(values)):
    new_data_dic[values[j]] = rbsp_ephm[values[j]]
于 2012-11-23T11:11:09.123 に答える