2017-09-06 3 views
0

Je n'arrive pas à faire fonctionner ceci. Tous les exemples et les threads ont tous des personnes qui créent de nouveaux jeux de données. Je veux juste mettre à jour un champ dans un ensemble de données déjà créé.Mise à jour d'un champ dans le fichier HDF

Voici ce que j'ai:

h5_file = h5py.File(event_file_path, "r+") #this works 

event_processing_status = int(h5_file[PATH][STATUS].value[0]['Status']) #this works 
print({"{0:b}".format(event_processing_status)) #this works 
event_processing_status = (event_processing_status | STATUS_UPDATE) #this works 
h5_file[PATH][STATUS].value[0]['Status'] = event_processing_status #updating???, no error 
event_processing_status = int(h5_file[PATH][STATUS].value[0]['Status']) #this works 
print({"{0:b}".format(event_processing_status)) #not the update value 

h5_file.close() 

Qu'est-ce que je fais mal?

Plus d'infos: Les dtypes des colonnes du jeu de données:

dset = h5_file[PATH][STATUS] 
print(dset.dtype) gives: 
[('Status', '<u8'), ('Segments', '<u4'), ('Characterized', '<u4'), ('More_Segments', '<u4'), ('ID', '<i4'), ('Releases', '<u2'), ('Type', '|u1'), ('Track', '<i4')] 

dset[0,'Status'] = event_processing_status gives: 
TypeError: Field name selections are not allowed for write. 
+0

dans cette ligne 'h5_file [PATH] [STATUS] .value [0] ['Status']) = event_processing_status' il y a un extra) côté gauche de l'assignation. est-ce vraiment là? ou est-ce une faute de frappe? – Moher

+0

copier et coller la faute de frappe, désolé – lr100

+0

Essayez de modifier l'ordre d'indexation, '[Status '] [0]'. Je suppose que 'Status' est un nom de champ de tableau structuré. 'h5py'lets vous avez combiné le numéro d'enregistrement et le nom de domaine en une seule instruction:' dset [0, 'Status'] = status'. http://docs.h5py.org/en/latest/high/dataset.html#reading-writing-data. Si ma supposition n'aide pas, montrez-nous le 'dtype' de cet ensemble de données. – hpaulj

Répondre

0

C'est ce que je devais faire:

h5_file = h5py.File(event_file_path, "r+") #this works 

#Retrieve the dataset containing Event_Status 
data= h5_file[PATH][STATUS] 

#Get the Event_Status (np.array) 
event_status = data['Event_Status'] 

#Update the value of Event_Status 
event_status[0] = np.bitwise_or(event_status[0],np.uint64(STATUS_UPDATE)) 

#Write updated value to file 
elements = data[0] 
elements['Event_Status'] = event_status 
data[0] = elements 

h5_file.close() 
0

Faisant suite à mon commentaire, en supposant que votre ensemble de données est un DTYPE structuré/composé

In [144]: f = h5py.File('test.h5','w') 
In [145]: arr = np.ones((3,), dtype='i,f') # structured array 
In [146]: arr 
Out[146]: 
array([(1, 1.), (1, 1.), (1, 1.)], 
     dtype=[('f0', '<i4'), ('f1', '<f4')]) 

créer ensemble de données avec données

In [147]: ds = f.create_dataset('arr',data=arr) 
In [148]: ds 
Out[148]: <HDF5 dataset "arr": shape (3,), type "|V8"> 
In [149]: ds.value 
Out[149]: 
array([(1, 1.), (1, 1.), (1, 1.)], 
     dtype=[('f0', '<i4'), ('f1', '<f4')]) 

Je peux l'indexer avec l'ID d'enregistrement et le nom de champ; cela ne fonctionne pas pour ds.value ou pour arr.

In [151]: ds[0,'f0'] 
Out[151]: 1 
In [152]: ds[0,'f0'] = 2 # and I can assign values 
In [153]: ds.value 
Out[153]: 
array([(2, 1.), (1, 1.), (1, 1.)], 
     dtype=[('f0', '<i4'), ('f1', '<f4')]) 

Je peux indexer avec des entrées d'enregistrement et de champ séparées; mais ne peut pas modifier les valeurs de cette façon:

In [154]: ds[0]['f1'] 
Out[154]: 1.0 
In [155]: ds[0]['f1'] = 234 
In [156]: ds.value 
Out[156]: 
array([(2, 1.), (1, 1.), (1, 1.)], 
     dtype=[('f0', '<i4'), ('f1', '<f4')]) 
In [157]: ds['f1'][0] = 234 
In [158]: ds.value 
Out[158]: 
array([(2, 1.), (1, 1.), (1, 1.)], 
     dtype=[('f0', '<i4'), ('f1', '<f4')]) 

Affectation nécessite l'indexation combinée

In [159]: ds[0,'f1'] = 234 
In [160]: ds.value 
Out[160]: 
array([(2, 234.), (1, 1.), (1, 1.)], 
     dtype=[('f0', '<i4'), ('f1', '<f4')]) 
+0

Essayé votre définition d'affectation, mais cela n'a pas fonctionné.J'ai mis à jour le message original avec plus d'informations – lr100

+0

@ lr100, votre 'dset'dtype fonctionne pour moi.Quel est votre numéro de version' h5py'? – hpaulj

+0

ma version h5py est 2.0.0 et ne peut pas être mise à jour – lr100