是否可以将每个HDF5数据集保存为.csv列?

问题描述 投票:-1回答:1

我正在努力使用H5文件来提取数据并将其保存为多列csv。如图所示,h5文件的结构由主要组(基因型,位置和分类单元)组成。以基因型为主体的基因组包含1500多个子组(基因型部分名称),每个子组包含子太阳组(基因型的全名)。大约有100万个数据集(命名调用)-每个数据集都放在一个子集中-子组-我需要将它们编写-每个组-在单独的列中。问题是,当我使用h5py(group.get函数)时,我必须使用任何调用的路径。我提取了路径末尾包含“通话”的所有路径,但我无法到达所有一百万次调用,将它们保存到一个csv文件中。任何人都可以帮助我提取8位整数i的“调用”作为csv文件中的单独列。enter image description here

h5py
1个回答
0
投票

下面附上一个非常简单的示例,该示例显示如何使用.visititems()递归循环所有顶级对象。.visititems()可调用函数(dump_calls2csv)执行以下操作:1)检查名称中带有calls的数据集对象。2)找到匹配的对象时,将执行以下操作:a)将数据读取到一个Numpy数组中,b)创建一个唯一的文件名(在H5组/数据集路径名上使用字符串替换以确保唯一性),c)用numpy.savetxt()将数据写入文件。

为了完整起见,我包括了创建测试文件的代码。

import h5py
import numpy as np

def dump_calls2csv(name, node):    

    if isinstance(node, h5py.Dataset) and 'calls' in node.name :
       print ('visiting object:', node.name, ', exporting data to CSV')
       csvfname = node.name[1:].replace('/','_') +'.csv'
       arr = node[:]
       np.savetxt(csvfname, arr, fmt='%5d', delimiter=',')

##########################    

ngrps = 2
nsgrps = 3
nds = 4
nrows = 10
ncols = 2

#i_arr_dtype = ( [ ('col1', int), ('col2', int) ] )
with h5py.File('SO_61725716.h5', 'w') as h5w :    
    for gcnt in range(ngrps):
        grp1 = h5w.create_group('Group_'+str(gcnt))
        for scnt in range(nsgrps):
            grp2 = grp1.create_group('SubGroup_'+str(scnt))
            for dcnt in range(nds):
                i_arr = np.random.randint(1,100, (nrows,ncols) )
                ds = grp2.create_dataset('calls_'+str(dcnt), data=i_arr)

with h5py.File('SO_61725716.h5', 'r') as h5r : 

    h5r.visititems(dump_calls2csv) #NOTE: function name is NOT a string!

如果想花哨的话,可以将arr中的np.savetxt()替换为node[:]。另外,您还希望在CSV文件中包含标题,从数据集中提取并引用dtype字段名称(在此示例中,我没有创建任何字段)。

© www.soinside.com 2019 - 2024. All rights reserved.