2017-09-06 2 views
0

Ich kann nicht scheinen, dass dies funktioniert. Alle Beispiele und Threads haben Leute, die neue Datensätze erstellen. Ich möchte nur ein Feld in einem Datensatz aktualisieren, der bereits erstellt wurde.Aktualisieren eines Feldes in HDF-Datei

Hier ist, was ich habe:

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() 

Was mache ich falsch?

Weitere Informationen: Die dtypes der Spalten des Datensatzes:

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

in dieser Zeile 'h5_file [PATH] [STATUS] .value [0] ['Status']) = event_processing_status 'Es gibt eine extra) linke Seite der Zuweisung. Ist es wirklich da? oder ist es ein Tippfehler? – Moher

+0

Kopieren und Einfügen Tippfehler, Entschuldigung – lr100

+0

Versuchen Sie, die Indexreihenfolge zu ändern, '[Status '] [0]'. Ich nehme an, 'Status' ist ein strukturierter Array-Feldname. 'h5py'lets Sie haben Datensatznummer und Feldname in einer Anweisung zusammengefasst:' dset [0, 'Status'] = status'. http://docs.h5py.org/en/latest/high/dataset.html#reading-writing-data. Wenn meine Vermutung nicht hilft, zeigen Sie uns den 'dtype' dieses Datensatzes. – hpaulj

Antwort

0

Das ist das, was ich zu tun hatte:

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

Im Anschluss an meinen Kommentar oben, unter der Annahme, dass das Dataset eine strukturierte ist/Verbindung dtype

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')]) 

Dataset erstellen mit Daten

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')]) 

Ich kann es mit Datensatz-ID und Feldnamen indizieren; dies funktioniert nicht für ds.value oder für 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')]) 

Ich kann mit separaten Datensatz- und Feldeinträgen indizieren; kann aber nicht Werte auf diese Weise ändern:

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')]) 

Zuordnung erfordert die kombinierte Indizierung

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

Versuchte Ihre Zuordnungsdefinition, aber es funktionierte nicht Ich aktualisierte den ursprünglichen Pfosten mit mehr Informationen – lr100

+0

@ lr100, Ihr 'dset'dtype funktioniert für mich Was ist Ihre' h5py' Versionsnummer? Meine ist '2.6.0 '. – hpaulj

+0

Meine h5py Version ist 2.0.0 und kann nicht aktualisiert werden – lr100

Verwandte Themen