1
- from typing import Sequence
1
+ from typing import Sequence , Dict
2
+ import os
2
3
3
- from netCDF4 import Dataset as nc_dataset
4
+ import netCDF4
4
5
5
6
from xarray import open_dataset
6
7
7
- from .datatree import DataTree , PathType
8
+ from .datatree import DataTree , DataNode , PathType
8
9
9
10
10
- def _get_group_names ( file ):
11
- rootgrp = nc_dataset ( "test.nc" , "r" , format = "NETCDF4" )
11
+ def _open_group_children_recursively ( filename , node , ncgroup , chunks , ** kwargs ):
12
+ for g in ncgroup . groups . values ():
12
13
13
- def walktree (top ):
14
- yield top .groups .values ()
15
- for value in top .groups .values ():
16
- yield from walktree (value )
14
+ # Open and add this node's dataset to the tree
15
+ name = os .path .basename (g .path )
16
+ ds = open_dataset (filename , group = g .path , chunks = chunks , ** kwargs )
17
+ child_node = DataNode (name , ds )
18
+ node .add_child (child_node )
17
19
18
- groups = []
19
- for children in walktree (rootgrp ):
20
- for child in children :
21
- # TODO include parents in saved path
22
- groups .append (child .name )
20
+ _open_group_children_recursively (filename , node [name ], g , chunks , ** kwargs )
23
21
24
- rootgrp .close ()
25
- return groups
26
22
27
-
28
- def open_datatree (filename_or_obj , engine = None , chunks = None , ** kwargs ) -> DataTree :
29
- """
30
- Open and decode a dataset from a file or file-like object, creating one DataTree node
31
- for each group in the file.
23
+ def open_datatree (filename : str , chunks : Dict = None , ** kwargs ) -> DataTree :
32
24
"""
25
+ Open and decode a dataset from a file or file-like object, creating one Tree node for each group in the file.
33
26
34
- # TODO find all the netCDF groups in the file
35
- file_groups = _get_group_names (filename_or_obj )
27
+ Parameters
28
+ ----------
29
+ filename
30
+ chunks
31
+
32
+ Returns
33
+ -------
34
+ DataTree
35
+ """
36
36
37
- # Populate the DataTree with the groups
38
- groups_and_datasets = {group_path : open_dataset (engine = engine , chunks = chunks , ** kwargs )
39
- for group_path in file_groups }
40
- return DataTree (data_objects = groups_and_datasets )
37
+ with netCDF4 .Dataset (filename , mode = 'r' ) as ncfile :
38
+ ds = open_dataset (filename , chunks = chunks , ** kwargs )
39
+ tree_root = DataTree (data_objects = {'root' : ds })
40
+ _open_group_children_recursively (filename , tree_root , ncfile , chunks , ** kwargs )
41
+ return tree_root
41
42
42
43
43
- def open_mfdatatree (filepaths , rootnames : Sequence [PathType ] = None , engine = None , chunks = None , ** kwargs ) -> DataTree :
44
+ def open_mfdatatree (filepaths , rootnames : Sequence [PathType ] = None , chunks = None , ** kwargs ) -> DataTree :
44
45
"""
45
46
Open multiple files as a single DataTree.
46
47
@@ -55,11 +56,11 @@ def open_mfdatatree(filepaths, rootnames: Sequence[PathType] = None, engine=None
55
56
full_tree = DataTree ()
56
57
57
58
for file , root in zip (filepaths , rootnames ):
58
- dt = open_datatree (file , engine = engine , chunks = chunks , ** kwargs )
59
- full_tree ._set_item (path = root , value = dt , new_nodes_along_path = True , allow_overwrites = False )
59
+ dt = open_datatree (file , chunks = chunks , ** kwargs )
60
+ full_tree .set_node (path = root , node = dt , new_nodes_along_path = True , allow_overwrite = False )
60
61
61
62
return full_tree
62
63
63
64
64
- def _datatree_to_netcdf (dt : DataTree , path_or_file : str ):
65
+ def _datatree_to_netcdf (dt : DataTree , filepath : str ):
65
66
raise NotImplementedError
0 commit comments