source: hdf5_exchange/h5py_examples/src/h5toText/h5toText.py @ 240

Last change on this file since 240 was 240, checked in by jemian, 12 years ago

indentation

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Date Revision Author HeadURL Id
File size: 7.6 KB
Line 
1#!/usr/bin/env python
2
3'''
4Created on Dec 17, 2010
5
6@author: prjemian
7########### SVN repository information ###################
8# $Date: 2011-01-20 21:38:14 +0000 (Thu, 20 Jan 2011) $
9# $Author: jemian $
10# $Revision: 240 $
11# $URL: hdf5_exchange/h5py_examples/src/h5toText/h5toText.py $
12# $Id: h5toText.py 240 2011-01-20 21:38:14Z jemian $
13########### SVN repository information ###################
14'''
15
16import h5py
17import os
18import sys
19import getopt
20
21
22class H5toText(object):
23    ''' classdocs '''
24    filename = None
25    requested_filename = None
26    isNeXus = False
27    array_items_shown = 5
28
29    def __init__(self, filename, makeReport = False):
30        ''' Constructor '''
31        self.requested_filename = filename
32        if os.path.exists(filename):
33            self.filename = filename
34            self.isNeXus = self.testIsNeXus()
35            if makeReport:
36                self.report()
37
38    def report(self):
39        ''' reporter '''
40        if self.filename == None: return
41        f = h5py.File(self.filename, 'r')
42        txt = self.filename
43        if self.isNeXus:
44            txt += ":NeXus data file"
45        self.showGroup(f, txt, indentation = "")
46        f.close()
47
48    def testIsNeXus(self):
49        ''' test if the selected HDF5 file is a NeXus file '''
50        result = False
51        try:
52            f = h5py.File(self.filename, 'r')
53            for value in f.itervalues():
54                if str(type(value)) in ("<class 'h5py.highlevel.Group'>"):
55                    if 'NX_class' in value.attrs:
56                        v = value.attrs['NX_class']
57                        if type(v) == type("a string"):
58                            if v == 'NXentry':
59                                result = True
60                                break
61            f.close()
62        except:
63            pass
64        return result
65
66    def showGroup(self, obj, name, indentation = "  "):
67        '''print the contents of the group'''
68        nxclass = ""
69        if 'NX_class' in obj.attrs:
70            class_attr = obj.attrs['NX_class']
71            nxclass = ":" + str(class_attr)
72        print indentation + name + nxclass
73        self.showAttributes(obj, indentation)
74        for name, value in obj.items():
75            #print name, type(value)
76            if str(type(value)) in ("<class 'h5py.highlevel.File'>", "<class 'h5py.highlevel.Group'>"):
77                self.showGroup(value, name, indentation = indentation+"  ")
78            else:
79                self.showDataset(value, name, indentation = indentation+"  ")
80
81    def showAttributes(self, obj, indentation = "  "):
82        for name, value in obj.attrs.iteritems():
83            print "%s  @%s = %s" % (indentation, name, str(value))
84
85    def showDataset(self, dset, name, indentation = "  "):
86        shape = dset.shape
87        if self.isNeXus:
88            if "target" in dset.attrs:
89                if dset.attrs['target'] != dset.name:
90                    print "%s%s --> %s" % (indentation, name, dset.attrs['target'])
91                    return
92        txType = self.getType(dset)
93        txShape = self.getShape(dset)
94        if shape == (1,):
95            value = " = %s" % str(dset[0])
96            print "%s%s:%s%s%s" % (indentation, name, txType, txShape, value)
97            self.showAttributes(dset, indentation)
98        else:
99            print "%s%s:%s%s = __array" % (indentation, name, txType, txShape)
100            self.showAttributes(dset, indentation)  # show these before __array
101            if self.array_items_shown > 2:
102                value = self.formatArray(dset, indentation + '  ')
103                print "%s  %s = %s" % (indentation, "__array", value)
104            else:
105                print "%s  %s: %s" % (indentation, "__array", "not shown")
106
107    def getType(self, obj):
108        ''' get the storage (data) type of the dataset '''
109        t = str(obj.dtype)
110        if t[0:2] == '|S':
111            t = 'char[%s]' % t[2:]
112        if self.isNeXus:
113            t = 'NX_' + t.upper()
114        return t
115
116    def getShape(self, obj):
117        ''' return the shape of the HDF5 dataset '''
118        s = obj.shape
119        l = []
120        for dim in s:
121            l.append(str(dim))
122        if l == ['1']:
123            result = ""
124        else:
125            result = "[%s]" % ",".join(l)
126        return result
127
128    def formatArray(self, obj, indentation = '  '):
129        ''' nicely format an array up to rank=5 '''
130        shape = obj.shape
131        r = ""
132        if len(shape) in (1, 2, 3, 4, 5):
133            r = self.formatNdArray(obj, indentation + '  ')
134        if len(shape) > 5:
135            r = "### no arrays for rank > 5 ###"
136        return r
137
138    def decideNumShown(self, n):
139        ''' determine how many values to show '''
140        if self.array_items_shown != None:
141            if n > self.array_items_shown:
142                n = self.array_items_shown - 2
143        return n
144
145    def formatNdArray(self, obj, indentation = '  '):
146        ''' return a list of lower-dimension arrays, nicely formatted '''
147        shape = obj.shape
148        rank = len(shape)
149        if not rank in (1, 2, 3, 4, 5): return None
150        n = self.decideNumShown( shape[0] )
151        r = []
152        for i in range(n):
153            if rank == 1: item = obj[i]
154            if rank == 2: item = self.formatNdArray(obj[i, :])
155            if rank == 3: item = self.formatNdArray(obj[i, :, :], indentation + '  ')
156            if rank == 4: item = self.formatNdArray(obj[i, :, :, :], indentation + '  ')
157            if rank == 5: item = self.formatNdArray(obj[i, :, :, :, :], indentation + '  ')
158            r.append( item )
159        if n < shape[0]:
160            # skip over most
161            r.append("...")
162            #  get the last one
163            if rank == 1: item = obj[-1]
164            if rank == 2: item = self.formatNdArray(obj[-1, :])
165            if rank == 3: item = self.formatNdArray(obj[-1, :, :], indentation + '  ')
166            if rank == 4: item = self.formatNdArray(obj[-1, :, :, :], indentation + '  ')
167            if rank == 5: item = self.formatNdArray(obj[-1, :, :, :, :], indentation + '  ')
168            r.append( item )
169        if rank == 1:
170            s = str( r )
171        else:
172            s = "[\n" + indentation + '  '
173            s += ("\n" + indentation + '  ').join(r)
174            s += "\n" + indentation + "]"
175        return s
176
177
178if __name__ == '__main__':
179    limit = 5
180    filelist = []
181    filelist.append('../Create/example1.hdf5')
182    filelist.append('../Create/example2.hdf5')
183    filelist.append('../Create/example3.hdf5')
184    filelist.append('../Create/example4.hdf5')
185    filelist.append('../../../NeXus/definitions/trunk/manual/examples/h5py/prj_test.nexus.hdf5')
186    filelist.append('../../../NeXus/definitions/exampledata/code/hdf5/dmc01.h5')
187    filelist.append('../../../NeXus/definitions/exampledata/code/hdf5/dmc02.h5')
188    filelist.append('../../../NeXus/definitions/exampledata/code/hdf5/focus2007n001335.hdf')
189    filelist.append('../../../NeXus/definitions/exampledata/code/hdf5/NXtest.h5')
190    filelist.append('../../../NeXus/definitions/exampledata/code/hdf5/sans2009n012333.hdf')
191    filelist.append('../Create/simple5.nxs')
192    filelist.append('../Create/bad.h5')
193    #filelist = []
194    #filelist.append('testG.h5')
195    #filelist.append('testG-pj.h5')
196    if len(sys.argv) > 1:
197        try:
198            opts, args = getopt.getopt(sys.argv[1:], "n:")
199        except:
200            print
201            print "SVN: $Id: h5toText.py 240 2011-01-20 21:38:14Z jemian $"
202            print "usage: ", sys.argv[0], " [-n ##] HDF5_file_name [another_HDF5_file_name]"
203            print "  -n ## : limit number of displayed array items to ## (must be 3 or more or 'None')"
204            print
205        for item in opts:
206            if item[0] == "-n":
207                if item[1].lower() == "none":
208                    limit = None
209                else:
210                    limit = int(item[1])
211        filelist = args
212    for item in filelist:
213        mc = H5toText(item)
214        mc.array_items_shown = limit
215        mc.report()
Note: See TracBrowser for help on using the repository browser.