2010-06-11 71 views
4

我使用h5py python包来读取HDF5格式的文件。 (例如somefile.h5) 我想将数据集的内容写入文本文件。什么是将h5py数据集输出到文本的快速方法?

例如,我想创建一个文本文件,其内容如下: 1,20,31,75,142,324,78,12,3,90,8,21,1

我能使用此代码访问该数据集的Python:

import h5py 
f  = h5py.File('/Users/Me/Desktop/thefile.h5', 'r') 
group = f['/level1/level2/level3'] 
dset = group['dsetname'] 

我幼稚的做法是太慢了,因为我的数据集有超过20000项:

# write all values to file   
for index in range(len(dset)): 
     # do not add comma after last value 
     if index == len(dset)-1: txtfile.write(repr(dset[index])) 
     else:     txtfile.write(repr(dset[index])+',') 
txtfile.close() 
    return None 

有没有写这一个文件更快的方法?也许我可以将数据集转换为NumPy数组或甚至Python列表,然后使用一些文件写入工具?

(我可以写入文件之前串接值到一个较大的字符串尝试,但我希望有什么东西完全是更优雅)

+0

在Python中,使用'range(len(dset))'几乎总是一个糟糕的主意。总是比较喜欢迭代器,特别是因为对于大'dset','range'实际上是创建并分配了一个'len(dset)'整数列表。 – 2011-06-16 16:55:30

回答

5

建设一个大型的字符串具有节省了需要的巨大优势高飞“最后一次开关”得益于出色的join方法的字符串:更换你的整个循环,

txtfile.write(','.join(repr(item) for item in dset)) 

我不知道有多少你更优雅要求你的代码... ;-)

2

也许在HDF5文件上使用h5dump?

我使用(bash)的

(h5dump -y -o /dev/stderr -d $dataset $infile >$errorout) 2>&1 | sed -e 's/, /\n/g' -e 's/,$//' | sed 's/ //g' > $outfile 2> $errorout 
+0

sudo apt-get install hdf5-tools – 2014-01-31 14:55:58

3

你原来的怀疑是正确的,首先将其转换为numpy的数组,然后转储数组ASCII。

my_data = my_h5_group['dsetname'].value # is now a Numpy array 
my_data.tofile("my_data.txt") 

这将比迭代组对象本身快得多。

+0

这并没有将其转换为ascii。 – toddmo 2017-10-01 02:07:57

+0

对不起,使用'my_data.tofile('my_data.txt',sep ='',format ='%f')'或者更多选项使用'numpy.savetxt'。 – 2018-02-08 15:29:47

相关问题