1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
import sys
import unittest
import os
import tempfile
import netCDF4
from netCDF4 import __has_rename_grp__
# test changing dimension, variable names
# and deleting attributes.
FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name
LAT_NAME="lat"
LON_NAME="lon"
LON_NAME2 = "longitude"
LEVEL_NAME="level"
TIME_NAME="time"
VAR_NAME='temp'
VAR_NAME2='wind'
GROUP_NAME='subgroup'
GROUP_NAME2='subgroup2'
class VariablesTestCase(unittest.TestCase):
def setUp(self):
self.file = FILE_NAME
f = netCDF4.Dataset(self.file, 'w')
f.createDimension(LAT_NAME,73)
f.createDimension(LON_NAME,145)
f.createDimension(LEVEL_NAME,10)
f.createDimension(TIME_NAME,None)
if __has_rename_grp__:
g = f.createGroup(GROUP_NAME)
else:
g = f.createGroup(GROUP_NAME2)
g.createDimension(LAT_NAME,145)
g.createDimension(LON_NAME,289)
g.createDimension(LEVEL_NAME,20)
g.createDimension(TIME_NAME,None)
f.foo = 'bar'
f.goober = 2
g.foo = 'bar'
g.goober = 2
f.createVariable(VAR_NAME,'f4',(LAT_NAME, LON_NAME, TIME_NAME))
v = f.variables[VAR_NAME]
v.bar = 'foo'
v.slobber = 3
g.createVariable(VAR_NAME,'f4',(LAT_NAME, LON_NAME, TIME_NAME))
v2 = g.variables[VAR_NAME]
v2.bar = 'foo'
v2.slobber = 3
f.close()
def tearDown(self):
# Remove the temporary files
os.remove(self.file)
def runTest(self):
"""testing renaming of dimensions, variables and attribute deletion"""
f = netCDF4.Dataset(self.file, 'r+')
v = f.variables[VAR_NAME]
names_check = [LAT_NAME, LON_NAME, LEVEL_NAME, TIME_NAME]
# check that dimension names are correct.
for name in f.dimensions.keys():
self.assertTrue(name in names_check)
names_check = [VAR_NAME]
# check that variable names are correct.
for name in f.variables.keys():
self.assertTrue(name in names_check)
# rename dimension.
f.renameDimension(LON_NAME,LON_NAME2)
# rename variable.
f.renameVariable(VAR_NAME,VAR_NAME2)
# rename group.
if __has_rename_grp__:
f.renameGroup(GROUP_NAME,GROUP_NAME2)
# check that new dimension names are correct.
names_check = [LAT_NAME, LON_NAME2, LEVEL_NAME, TIME_NAME]
for name in f.dimensions.keys():
self.assertTrue(name in names_check)
names_check = [VAR_NAME2]
# check that new variable names are correct.
for name in f.variables.keys():
self.assertTrue(name in names_check)
g = f.groups[GROUP_NAME2]
vg = g.variables[VAR_NAME]
names_check = [LAT_NAME, LON_NAME, LEVEL_NAME, TIME_NAME]
# check that dimension names are correct.
for name in g.dimensions.keys():
self.assertTrue(name in names_check)
names_check = [VAR_NAME]
# check that variable names are correct.
for name in g.variables.keys():
self.assertTrue(name in names_check)
# check that group name is correct.
self.assertTrue(GROUP_NAME not in f.groups and GROUP_NAME2 in f.groups)
# rename dimension.
g.renameDimension(LON_NAME,LON_NAME2)
# rename variable.
g.renameVariable(VAR_NAME,VAR_NAME2)
# check that new dimension names are correct.
names_check = [LAT_NAME, LON_NAME2, LEVEL_NAME, TIME_NAME]
for name in g.dimensions.keys():
self.assertTrue(name in names_check)
names_check = [VAR_NAME2]
# check that new variable names are correct.
for name in g.variables.keys():
self.assertTrue(name in names_check)
# delete a global attribute.
atts = f.ncattrs()
del f.goober
atts.remove('goober')
self.assertTrue(atts == f.ncattrs())
atts = g.ncattrs()
del g.goober
atts.remove('goober')
self.assertTrue(atts == g.ncattrs())
# delete a variable attribute.
atts = v.ncattrs()
del v.slobber
atts.remove('slobber')
self.assertTrue(atts == v.ncattrs())
atts = vg.ncattrs()
del vg.slobber
atts.remove('slobber')
self.assertTrue(atts == vg.ncattrs())
f.close()
# make sure attributes cannot be deleted, or vars/dims renamed
# when file is open read-only.
f = netCDF4.Dataset(self.file)
v = f.variables[VAR_NAME2]
self.assertRaises(RuntimeError, delattr, v, 'bar')
self.assertRaises(RuntimeError, f.renameVariable, VAR_NAME2, VAR_NAME)
self.assertRaises(RuntimeError, f.renameDimension, LON_NAME2, LON_NAME)
g = f.groups[GROUP_NAME2]
vg = g.variables[VAR_NAME2]
self.assertRaises(RuntimeError, delattr, vg, 'bar')
self.assertRaises(RuntimeError, g.renameVariable, VAR_NAME2, VAR_NAME)
self.assertRaises(RuntimeError, g.renameDimension, LON_NAME2, LON_NAME)
f.close()
if __name__ == '__main__':
unittest.main()
|