from numpy import *
from tables import *

basedim = 4
file = "array4.h5"
# Open a new empty HDF5 file
fileh = open_file(file, mode = "w")
# Get the root group
group = fileh.root
# Set the type codes to test
dtypes = [int8, uint8, int16, int, float32, float]
i = 1
for dtype in dtypes:
    # Create an array of dtype, with incrementally bigger ranges
    a = ones((basedim,) * i, dtype)
    # Save it on the HDF5 file
    dsetname = 'array_' + a.dtype.char
    hdfarray = fileh.create_array(group, dsetname, a, "Large array")
    print "Created dataset:", hdfarray
    # Create a new group
    group = fileh.create_group(group, 'group' + str(i))
    # increment the range for next iteration
    i += 1

# Close the file
fileh.close()


# Open the previous HDF5 file in read-only mode
fileh = open_file(file, mode = "r")
# Get the root group
group = fileh.root
# Get the metadata on the previosly saved arrays
for i in range(len(dtypes)):
    # Create an array for later comparison
    a = ones((basedim,) * (i+1), dtypes[i])
    # Get the dset object hangin from group
    dset = getattr(group, 'array_' + a.dtype.char)
    print "Info from dataset:", repr(dset)
    # Read the actual data in array
    b = dset.read()
    print "Array b read from file. Shape ==>", b.shape,
    print ". Dtype ==> %s" % b.dtype
    # Test if the original and read arrays are equal
    if allclose(a, b):
        print "Good: Read array is equal to the original"
    else:
        print "Error: Read array and the original differs!"
    # Iterate over the next group
    group = getattr(group, 'group' + str(i+1))

# Close the file
fileh.close()
