@@ -100,7 +100,7 @@ def __init__(self, file, filetype="cdf"):
100
100
globalatts .get ("MAGNETIC_MODELS" , [])
101
101
)
102
102
self .data_filters = self ._ensure_list (globalatts .get ("DATA_FILTERS" , []))
103
- self .variables = self ._cdf .cdf_info ()[ "zVariables" ]
103
+ self .variables = self ._get_attr_or_key ( self . _cdf .cdf_info (), "zVariables" )
104
104
self ._varatts = {var : self ._cdf .varattsget (var ) for var in self .variables }
105
105
self ._varinfo = {var : self ._cdf .varinq (var ) for var in self .variables }
106
106
else :
@@ -110,7 +110,10 @@ def __enter__(self):
110
110
return self
111
111
112
112
def __exit__ (self , * args ):
113
- self ._cdf .close ()
113
+ try :
114
+ self ._cdf .close ()
115
+ except AttributeError :
116
+ pass
114
117
115
118
@staticmethod
116
119
def _open_cdf (file ):
@@ -130,6 +133,15 @@ def _ensure_list(attribute):
130
133
else :
131
134
return attribute
132
135
136
+ @staticmethod
137
+ def _get_attr_or_key (obj , attr ):
138
+ # Used to work around cdflib<1 & >=1 support
139
+ # cdflib>=1 introduces dataclasses in place of some dicts
140
+ if isinstance (obj , dict ):
141
+ return obj .get (attr , None )
142
+ else :
143
+ return getattr (obj , attr , None )
144
+
133
145
def get_variable (self , var ):
134
146
try :
135
147
data = self ._cdf .varget (var )
@@ -149,10 +161,10 @@ def get_variable_description(self, var):
149
161
return desc if desc else catdesc
150
162
151
163
def get_variable_numdims (self , var ):
152
- return self ._varinfo [var ]. get ( "Num_Dims" )
164
+ return self ._get_attr_or_key ( self . _varinfo [var ], "Num_Dims" )
153
165
154
166
def get_variable_dimsizes (self , var ):
155
- return self ._varinfo [var ]. get ( "Dim_Sizes" )
167
+ return self ._get_attr_or_key ( self . _varinfo [var ], "Dim_Sizes" )
156
168
157
169
@staticmethod
158
170
def _cdftime_to_datetime (t ):
@@ -467,7 +479,9 @@ def _check_outfile(path, path_extension, overwrite=False):
467
479
if path .split ("." )[- 1 ].lower () != path_extension :
468
480
raise TypeError (f"Filename extension should be { path_extension } " )
469
481
if os .path .isfile (path ) and not overwrite :
470
- raise Exception ("File not written as it already exists and overwrite=False" )
482
+ raise FileExistsError (
483
+ "File not written as it already exists and overwrite=False"
484
+ )
471
485
472
486
def to_file (self , path , overwrite = False ):
473
487
"""Saves the data to the specified file.
0 commit comments