我正在使用h5py python包来读取HDF5格式的文件。 (例如somefile.h5) 我想将数据集的内容写入文本文件。
例如,我想创建一个包含以下内容的文本文件: 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 :(得分:5)
通过优秀的join
字符串方法,构建一个大字符串具有节省愚蠢的“最后一次切换”的巨大优势:替换整个循环,
txtfile.write(','.join(repr(item) for item in dset))
我不确定你要求你的代码有多优雅......; - )
答案 1 :(得分:3)
您最初的怀疑是正确的,首先将其转换为Numpy数组,然后将该数组转储为ASCII。
my_data = my_h5_group['dsetname'].value # is now a Numpy array
my_data.tofile("my_data.txt")
这比迭代组对象本身要快得多。
答案 2 :(得分: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
答案 3 :(得分:1)
哦,我做同样的事情,我找到了方法。 如果您想访问这样的例子
print( hdf5['a'][i][j][k] )
这非常非常慢。这样做。
arr=hdf5[:] # at the out of loop
print( arr[i][j][k] ) # in the loop
只有这种微小的变化才能成功。