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