9
9
from zarr .attrs import Attributes
10
10
from zarr .core import Array
11
11
from zarr .storage import contains_array , contains_group , init_group , \
12
- DictStore , DirectoryStore , group_meta_key , attrs_key , listdir
12
+ DictStore , DirectoryStore , group_meta_key , attrs_key , listdir , rmdir
13
13
from zarr .creation import array , create , empty , zeros , ones , full , \
14
14
empty_like , zeros_like , ones_like , full_like
15
15
from zarr .util import normalize_storage_path , normalize_shape
@@ -406,13 +406,15 @@ def _write_op(self, f, *args, **kwargs):
406
406
with self ._synchronizer [group_meta_key ]:
407
407
return f (* args , ** kwargs )
408
408
409
- def create_group (self , name ):
409
+ def create_group (self , name , overwrite = False ):
410
410
"""Create a sub-group.
411
411
412
412
Parameters
413
413
----------
414
414
name : string
415
415
Group name.
416
+ overwrite : bool, optional
417
+ If True, overwrite any existing array with the given name.
416
418
417
419
Returns
418
420
-------
@@ -428,35 +430,25 @@ def create_group(self, name):
428
430
429
431
"""
430
432
431
- return self ._write_op (self ._create_group_nosync , name )
432
-
433
- def _create_group_nosync (self , name ):
433
+ return self ._write_op (self ._create_group_nosync , name ,
434
+ overwrite = overwrite )
434
435
436
+ def _create_group_nosync (self , name , overwrite = False ):
435
437
path = self ._item_path (name )
436
438
437
- # require intermediate groups
438
- segments = path .split ('/' )
439
- for i in range (len (segments )):
440
- p = '/' .join (segments [:i ])
441
- if contains_array (self ._store , p ):
442
- raise KeyError (name )
443
- elif not contains_group (self ._store , p ):
444
- init_group (self ._store , path = p , chunk_store = self ._chunk_store )
439
+ # create intermediate groups
440
+ self ._require_parent_group (path , overwrite = overwrite )
445
441
446
442
# create terminal group
447
- if contains_array (self ._store , path ):
448
- raise KeyError (name )
449
- if contains_group (self ._store , path ):
450
- raise KeyError (name )
451
- else :
452
- init_group (self ._store , path = path , chunk_store = self ._chunk_store )
453
- return Group (self ._store , path = path , read_only = self ._read_only ,
454
- chunk_store = self ._chunk_store ,
455
- synchronizer = self ._synchronizer )
443
+ init_group (self ._store , path = path , chunk_store = self ._chunk_store ,
444
+ overwrite = overwrite )
445
+ return Group (self ._store , path = path , read_only = self ._read_only ,
446
+ chunk_store = self ._chunk_store ,
447
+ synchronizer = self ._synchronizer )
456
448
457
- def create_groups (self , * names ):
449
+ def create_groups (self , * names , ** kwargs ):
458
450
"""Convenience method to create multiple groups in a single call."""
459
- return tuple (self .create_group (name ) for name in names )
451
+ return tuple (self .create_group (name , ** kwargs ) for name in names )
460
452
461
453
def require_group (self , name ):
462
454
"""Obtain a sub-group, creating one if it doesn't exist.
@@ -504,18 +496,20 @@ def require_groups(self, *names):
504
496
"""Convenience method to require multiple groups in a single call."""
505
497
return tuple (self .require_group (name ) for name in names )
506
498
507
- def _require_parent_group (self , path ):
499
+ def _require_parent_group (self , path , overwrite = False ):
508
500
segments = path .split ('/' )
509
501
for i in range (len (segments )):
510
502
p = '/' .join (segments [:i ])
511
503
if contains_array (self ._store , p ):
512
- raise KeyError (path )
504
+ init_group (self ._store , path = p ,
505
+ chunk_store = self ._chunk_store , overwrite = overwrite )
513
506
elif not contains_group (self ._store , p ):
514
507
init_group (self ._store , path = p , chunk_store = self ._chunk_store )
515
508
516
509
def create_dataset (self , name , data = None , shape = None , chunks = None ,
517
510
dtype = None , compressor = 'default' , fill_value = None ,
518
- order = 'C' , synchronizer = None , filters = None , ** kwargs ):
511
+ order = 'C' , synchronizer = None , filters = None ,
512
+ overwrite = False , ** kwargs ):
519
513
"""Create an array.
520
514
521
515
Parameters
@@ -540,7 +534,10 @@ def create_dataset(self, name, data=None, shape=None, chunks=None,
540
534
synchronizer : zarr.sync.ArraySynchronizer, optional
541
535
Array synchronizer.
542
536
filters : sequence of Codecs, optional
543
- Sequence of filters to use to encode chunk data prior to compression.
537
+ Sequence of filters to use to encode chunk data prior to
538
+ compression.
539
+ overwrite : bool, optional
540
+ If True, replace any existing array or group with the given name.
544
541
545
542
Returns
546
543
-------
@@ -564,21 +561,15 @@ def create_dataset(self, name, data=None, shape=None, chunks=None,
564
561
shape = shape , chunks = chunks , dtype = dtype ,
565
562
compressor = compressor , fill_value = fill_value ,
566
563
order = order , synchronizer = synchronizer ,
567
- filters = filters , ** kwargs )
564
+ filters = filters , overwrite = overwrite , ** kwargs )
568
565
569
566
def _create_dataset_nosync (self , name , data = None , shape = None , chunks = None ,
570
567
dtype = None , compressor = 'default' ,
571
568
fill_value = None , order = 'C' , synchronizer = None ,
572
- filters = None , ** kwargs ):
569
+ filters = None , overwrite = False , ** kwargs ):
573
570
574
571
path = self ._item_path (name )
575
- self ._require_parent_group (path )
576
-
577
- # guard conditions
578
- if contains_array (self ._store , path ):
579
- raise KeyError (name )
580
- if contains_group (self ._store , path ):
581
- raise KeyError (name )
572
+ self ._require_parent_group (path , overwrite = overwrite )
582
573
583
574
# determine synchronizer
584
575
if synchronizer is None :
@@ -590,15 +581,16 @@ def _create_dataset_nosync(self, name, data=None, shape=None, chunks=None,
590
581
compressor = compressor , fill_value = fill_value ,
591
582
order = order , synchronizer = synchronizer ,
592
583
store = self ._store , path = path ,
593
- chunk_store = self ._chunk_store , filters = filters , ** kwargs )
584
+ chunk_store = self ._chunk_store , filters = filters ,
585
+ overwrite = overwrite , ** kwargs )
594
586
595
587
else :
596
588
a = create (shape = shape , chunks = chunks , dtype = dtype ,
597
589
compressor = compressor , fill_value = fill_value ,
598
590
order = order , synchronizer = synchronizer ,
599
591
store = self ._store , path = path ,
600
592
chunk_store = self ._chunk_store , filters = filters ,
601
- ** kwargs )
593
+ overwrite = overwrite , ** kwargs )
602
594
603
595
return a
604
596
@@ -655,7 +647,8 @@ def create(self, name, **kwargs):
655
647
656
648
def _create_nosync (self , name , ** kwargs ):
657
649
path = self ._item_path (name )
658
- self ._require_parent_group (path )
650
+ overwrite = kwargs .get ('overwrite' , False )
651
+ self ._require_parent_group (path , overwrite = overwrite )
659
652
kwargs .setdefault ('synchronizer' , self ._synchronizer )
660
653
return create (store = self ._store , path = path ,
661
654
chunk_store = self ._chunk_store , ** kwargs )
@@ -667,7 +660,8 @@ def empty(self, name, **kwargs):
667
660
668
661
def _empty_nosync (self , name , ** kwargs ):
669
662
path = self ._item_path (name )
670
- self ._require_parent_group (path )
663
+ overwrite = kwargs .get ('overwrite' , False )
664
+ self ._require_parent_group (path , overwrite = overwrite )
671
665
kwargs .setdefault ('synchronizer' , self ._synchronizer )
672
666
return empty (store = self ._store , path = path ,
673
667
chunk_store = self ._chunk_store , ** kwargs )
@@ -679,7 +673,8 @@ def zeros(self, name, **kwargs):
679
673
680
674
def _zeros_nosync (self , name , ** kwargs ):
681
675
path = self ._item_path (name )
682
- self ._require_parent_group (path )
676
+ overwrite = kwargs .get ('overwrite' , False )
677
+ self ._require_parent_group (path , overwrite = overwrite )
683
678
kwargs .setdefault ('synchronizer' , self ._synchronizer )
684
679
return zeros (store = self ._store , path = path ,
685
680
chunk_store = self ._chunk_store , ** kwargs )
@@ -691,7 +686,8 @@ def ones(self, name, **kwargs):
691
686
692
687
def _ones_nosync (self , name , ** kwargs ):
693
688
path = self ._item_path (name )
694
- self ._require_parent_group (path )
689
+ overwrite = kwargs .get ('overwrite' , False )
690
+ self ._require_parent_group (path , overwrite = overwrite )
695
691
kwargs .setdefault ('synchronizer' , self ._synchronizer )
696
692
return ones (store = self ._store , path = path ,
697
693
chunk_store = self ._chunk_store , ** kwargs )
@@ -703,7 +699,8 @@ def full(self, name, fill_value, **kwargs):
703
699
704
700
def _full_nosync (self , name , fill_value , ** kwargs ):
705
701
path = self ._item_path (name )
706
- self ._require_parent_group (path )
702
+ overwrite = kwargs .get ('overwrite' , False )
703
+ self ._require_parent_group (path , overwrite = overwrite )
707
704
kwargs .setdefault ('synchronizer' , self ._synchronizer )
708
705
return full (store = self ._store , path = path ,
709
706
chunk_store = self ._chunk_store ,
@@ -716,7 +713,8 @@ def array(self, name, data, **kwargs):
716
713
717
714
def _array_nosync (self , name , data , ** kwargs ):
718
715
path = self ._item_path (name )
719
- self ._require_parent_group (path )
716
+ overwrite = kwargs .get ('overwrite' , False )
717
+ self ._require_parent_group (path , overwrite = overwrite )
720
718
kwargs .setdefault ('synchronizer' , self ._synchronizer )
721
719
return array (data , store = self ._store , path = path ,
722
720
chunk_store = self ._chunk_store , ** kwargs )
@@ -728,7 +726,8 @@ def empty_like(self, name, data, **kwargs):
728
726
729
727
def _empty_like_nosync (self , name , data , ** kwargs ):
730
728
path = self ._item_path (name )
731
- self ._require_parent_group (path )
729
+ overwrite = kwargs .get ('overwrite' , False )
730
+ self ._require_parent_group (path , overwrite = overwrite )
732
731
kwargs .setdefault ('synchronizer' , self ._synchronizer )
733
732
return empty_like (data , store = self ._store , path = path ,
734
733
chunk_store = self ._chunk_store , ** kwargs )
@@ -740,7 +739,8 @@ def zeros_like(self, name, data, **kwargs):
740
739
741
740
def _zeros_like_nosync (self , name , data , ** kwargs ):
742
741
path = self ._item_path (name )
743
- self ._require_parent_group (path )
742
+ overwrite = kwargs .get ('overwrite' , False )
743
+ self ._require_parent_group (path , overwrite = overwrite )
744
744
kwargs .setdefault ('synchronizer' , self ._synchronizer )
745
745
return zeros_like (data , store = self ._store , path = path ,
746
746
chunk_store = self ._chunk_store , ** kwargs )
@@ -752,7 +752,8 @@ def ones_like(self, name, data, **kwargs):
752
752
753
753
def _ones_like_nosync (self , name , data , ** kwargs ):
754
754
path = self ._item_path (name )
755
- self ._require_parent_group (path )
755
+ overwrite = kwargs .get ('overwrite' , False )
756
+ self ._require_parent_group (path , overwrite = overwrite )
756
757
kwargs .setdefault ('synchronizer' , self ._synchronizer )
757
758
return ones_like (data , store = self ._store , path = path ,
758
759
chunk_store = self ._chunk_store , ** kwargs )
@@ -764,7 +765,8 @@ def full_like(self, name, data, **kwargs):
764
765
765
766
def _full_like_nosync (self , name , data , ** kwargs ):
766
767
path = self ._item_path (name )
767
- self ._require_parent_group (path )
768
+ overwrite = kwargs .get ('overwrite' , False )
769
+ self ._require_parent_group (path , overwrite = overwrite )
768
770
kwargs .setdefault ('synchronizer' , self ._synchronizer )
769
771
return full_like (data , store = self ._store , path = path ,
770
772
chunk_store = self ._chunk_store , ** kwargs )
0 commit comments