2010-06-11 69 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

相關問題