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

如果我只有一个文件,这很好用,但如果我有两个或更多文件,它似乎关闭了密钥?我不确定这是否正是发生的事情,但是当我问是什么时new_data_dic,它给出的值{'Bfs_geo_a': <Closed HDF5 dataset>,...不会写入文本文件。我尝试在打开下一个(rbsp_ephm.close())之前关闭 hdf5 文件,但我得到了同样的错误。

感谢您的任何帮助!

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

也许不是直接的好解决方案,但您可以尝试将数据提取为 numpy 数组,这是一种更灵活的格式,而不是 h5py 数据集。请参阅下面的操作方法:

>>> 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 回答