有没有一种方法可以将每个HDF5数据集另存为.csv列?

时间:2020-05-11 08:49:40

标签: h5py

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

  1. 回溯(最近一次通话最后一次):文件“ path / file.py”,第32行, 在 h5r.visititems(dump_calls2csv)#注意:函数名称不是字符串!在visititems中的文件“ path / file.py”,第565行 返回h5o.visit(self.id,proxy)文件“ h5py_objects.pyx”,位于h5py._objects.with_phil.wrapper文件中的第54行 h5py._objects.with_phil.wrapper中的第55行中的“ h5py_objects.pyx”
    在h5py.h5o.visit文件中,文件“ h5py \ h5o.pyx”,第355行 h5py.defs.H5Ovisit_by_name文件中的“ h5py \ defs.pyx”行1641 h5py.h5o.cb_obj_simple文件中的“ h5py \ h5o.pyx”行302 代理中的“ path / file.py”,第564行 返回func(name,self [name])在dump_calls2csv中的文件“ path / file.py”,第10行 np.savetxt(csvfname,arr,fmt ='%5d',delimiter =',')文件“ << strong> array_function internals>”,保存文本文件中的第6行 savetxt中的“ path / file.py”行1377 open(fname,'wt')。close()OSError:[Errno 22]无效的参数:'Genotypes_ArgentineFlintyComposite-C(1)-37-BB-B2-1-B25-B2-B?-1-B:100000977_calls。 csv

1 个答案:

答案 0 :(得分:0)

2020年5月16日更新

  • 添加了第二个示例,该示例使用Pytables读取和导出(aka 表格)使用.walk_nodes()。我比h5py更喜欢这种方法 .visititems()
  • 为清楚起见,我将创建示例文件的代码与 2个读取和导出CSV数据的示例。

下面附有2个简单的示例,它们显示了如何在所有顶级对象上递归循环。为了完整起见,创建测试文件的代码在本文的结尾。

示例1:使用h5py
本示例将.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=',')

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

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字段名称(在此示例中,我没有创建任何字段)。

示例2:使用PyTables(表)
本示例使用.walk_nodes()方法和以下过滤器:classname='Leaf'。在PyTables中,叶子可以是任何存储类(数组和表)。
该过程类似于上面的方法。 walk_nodes()简化了查找数据集的过程,并且不需要调用单独的函数。

import tables as tb
import numpy as np

with tb.File('SO_61725716.h5', 'r') as h5r :     
    for node in h5r.walk_nodes('/',classname='Leaf') :         
       print ('visiting object:', node._v_pathname, 'export data to CSV')
       csvfname = node._v_pathname[1:].replace('/','_') +'.csv'
       np.savetxt(csvfname, node.read(), fmt='%d', delimiter=',')

为完整起见,请使用下面的代码创建示例中使用的测试文件。

import h5py
import numpy as np

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

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)