【问题标题】:Reading in multiple hdf5 files and appending them to a new dictionary读取多个 hdf5 文件并将它们附加到新字典
【发布时间】:2023-03-02 22:35:02
【问题描述】:

我有一个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 文件,但我得到了同样的错误。

感谢您的任何帮助!

【问题讨论】:

    标签: python dictionary hdf5 h5py


    【解决方案1】:

    也许不是直接的好解决方案,但您可以尝试将数据提取为 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]]
    

    【讨论】:

      【解决方案2】:

      我不太明白您的问题...您正在尝试创建 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]}
      

      它回答了你的问题吗?

      【讨论】:

      • 我试图从 hdf5 文件中获取数据并将其放入字典中打开一个新文件并获取该数据,并将其附加到字典中已有的数据中。似乎正在发生的事情是,如果您有一个文件,它可以正常工作,但是一旦您打开第二个文件,第一个文件就会被关闭并被遗忘。
      • 不,如果你认为它只是当你做rbsp_ephm[values[j]],它不是你处理的实际数据(它是HDF5 dataset对象),你必须做rbsp_ephm[values[j]][()]。尝试打印两者以确保...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 2022-12-05
      • 2021-11-10
      • 2020-07-28
      • 2020-06-21
      相关资源
      最近更新 更多