2010-06-11 2 views
4

J'utilise le paquet h5py python pour lire des fichiers au format HDF5. (par exemple, somefile.h5) Je voudrais écrire le contenu d'un ensemble de données dans un fichier texte.Qu'est-ce qu'un moyen rapide de produire un ensemble de données h5py en texte?

Par exemple, je voudrais créer un fichier texte avec le contenu suivant: 1,20,31,75,142,324,78,12,3,90,8,21,1

Je suis en mesure de accéder à l'ensemble de données en python utilisant ce code:

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

mon approche naïve est trop lent, parce que mon jeu de données a plus de 20 000 entrées:

# 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 

est-il un moyen plus rapide d'écrire à un fichier? Peut-être que je pourrais convertir l'ensemble de données dans un tableau NumPy ou même une liste Python, puis utiliser un outil d'écriture de fichier?

(je pourrais expérimenter concaténer les valeurs dans une chaîne plus grande avant d'écrire un fichier, mais j'espère qu'il ya quelque chose de tout à fait plus élégant)

+0

En Python, c'est presque toujours une mauvaise idée d'utiliser 'range (len (dset))'. Préférez toujours les itérateurs, en particulier parce que pour un grand 'dset',' range' est en train de créer et d'allouer une liste d'entiers 'len (dset)'. –

Répondre

5

Construire une grande chaîne a l'énorme avantage de sauver la nécessité de loufoques grâce « commutateur dernier temps » à l'excellente méthode join de chaînes: pour remplacer la boucle entière,

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

Je ne suis pas sûr combien plus élégant vous demande votre code pour être ... ;-)

2

peut-être utiliser h5dump sur le fichier HDF5?

J'utilise (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 installer hdf5-tools –

3

vos soupçons d'origine était correcte, d'abord le convertir en un tableau numpy, puis vider ce tableau ASCII.

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

Ceci sera considérablement plus rapide que l'itération sur l'objet de groupe lui-même.

+0

Ceci ne l'a pas converti en ascii. – toddmo

+0

Désolé, utilisez 'my_data.tofile ('my_data.txt', sep = '', format = '% f')' ou pour plus d'options utilisez 'numpy.savetxt'. –

Questions connexes