2015-12-17 17 views
7

मैं अपनी hdf5 फ़ाइलों तक पहुंचने के लिए पायथन पैकेज h5py (संस्करण 2.5.0) का उपयोग करता हूं।h5py के साथ HDF5 डेटासेट और समूहों के बीच अंतर कैसे करें?

मैं एक फ़ाइल की सामग्री को पार करना चाहता हूं और प्रत्येक डेटासेट के साथ कुछ करना चाहता हूं। एक परीक्षण फ़ाइल मैं प्राप्त के लिए

import h5py 

def print_it(name): 
    dset = f[name] 
    print(dset) 
    print(type(dset)) 


with h5py.File('test.hdf5', 'r') as f: 
    f.visit(print_it) 

:

visit पद्धति का उपयोग करना

<HDF5 group "/x" (1 members)> 
<class 'h5py._hl.group.Group'> 
<HDF5 dataset "y": shape (100, 100, 100), type "<f8"> 
<class 'h5py._hl.dataset.Dataset'> 

जो मुझसे कहता है एक डाटासेट और फाइल में एक समूह होता है। हालांकि डेटासेट और समूहों के बीच अंतर करने के लिए type() का उपयोग करने के अलावा कोई स्पष्ट तरीका नहीं है। दुर्भाग्य से h5py documentation इस विषय के बारे में कुछ भी नहीं कहता है। वे हमेशा मानते हैं कि आप पहले से जानते हैं कि समूह क्या हैं और डेटासेट क्या हैं, उदाहरण के लिए क्योंकि उन्होंने डेटासेट स्वयं बनाया है।

f = h5py.File(..) 
for key in f.keys(): 
    x = f[key] 
    print(x.is_group(), x.is_dataset()) # does not exist 

मैं समूहों और डेटासेट के बीच कैसे अलग कर सकते हैं जब h5py साथ पायथन में एक अज्ञात HDF5 फ़ाइल को पढ़ने:

मैं की तरह कुछ है चाहते हैं? मैं सभी लिंक के सभी समूहों के सभी डेटासेट्स की सूची कैसे प्राप्त कर सकता हूं?

उत्तर

6

दुर्भाग्य से, यह देखने के लिए h5py api में कोई अंतर्निहित तरीका नहीं है, लेकिन आप आसानी से is_dataset = isinstance(item, h5py.Dataset) के साथ आइटम के प्रकार की जांच कर सकते हैं।

फ़ाइल की सभी सामग्री को सूचीबद्ध करने के लिए (फ़ाइल की विशेषताओं को छोड़कर) आप कॉल करने योग्य के साथ Group.visititems का उपयोग कर सकते हैं जो किसी आइटम का नाम और उदाहरण लेता है।

+0

धन्यवाद। मुझे लगता है कि सभी समूह 'h5py.Group' से प्राप्त होते हैं,' h5py.SoftLink' से सभी मुलायम लिंक और 'h5py.HardLink' से सभी हार्ड लिंक प्राप्त होते हैं। – Trilarion

+0

हो, एक अपवाद मैं उल्लेख करना भूल गया। अगर मुझे सही याद है, तो 'विज़िटिटम्स' बाहरी लिंक पर नहीं जाता है। – Gall

1

क्योंकि h5py इंटरऑक्शन के लिए अपनी विधि-पसंद के रूप में पाइथन शब्दकोश का उपयोग करता है, तो आपको वास्तव में आइटमों तक पहुंचने के लिए "मान()" फ़ंक्शन का उपयोग करने की आवश्यकता होती है। तो आप सूची फ़िल्टर का उपयोग करने में सक्षम हो सकते हैं:

datasets = [item for item in f["Data"].values() if isinstance(item, h5py.Dataset)] 

यह पुनरावर्ती करना काफी आसान होना चाहिए।

3

जबकि गैल और जेम्स स्मिथ के उत्तरों सामान्य रूप से समाधान का संकेत दे रहे हैं, हाइराचिकल एचडीएफ संरचना के माध्यम से ट्रैवर्सल और सभी डेटासेटों के फ़िल्टरिंग को अभी भी करने की आवश्यकता है। मैंने इसे yield from का उपयोग करके किया जो कि पाइथन 3.3+ में उपलब्ध है जो काफी अच्छी तरह से काम करता है और इसे यहां प्रस्तुत करता है।

import h5py 

def h5py_dataset_iterator(g, prefix=''): 
    for key in g.keys(): 
     item = g[key] 
     path = '{}/{}'.format(prefix, key) 
     if isinstance(item, h5py.Dataset): # test for dataset 
      yield (path, item) 
     elif isinstance(item, h5py.Group): # test for group (go down) 
      yield from h5py_dataset_iterator(item, path) 

with h5py.File('test.hdf5', 'r') as f: 
    for (path, dset) in h5py_dataset_iterator(f): 
     print(path, dset) 
0

मैं इस समाधान को प्राथमिकता देता हूं। यह HDF5 फ़ाइल "h5file" में सभी वस्तुओं की सूची पाता है, तो वर्ग, क्या इससे पहले कि लेकिन इस तरह के एक संक्षिप्त तरीके से नहीं उल्लेख किया गया है के लिए इसी तरह के आधार पर उन्हें क्रमबद्ध करता:

import h5py 
fh5 = h5py.File(h5file,'r') 
fh5.visit(all_h5_objs.append) 
all_groups = [ obj for obj in all_h5_objs if isinstance(fh5[obj],h5py.Group) ] 
all_datasets = [ obj for obj in all_h5_objs if isinstance(fh5[obj],h5py.Dataset) ] 
संबंधित मुद्दे