@@ -327,9 +327,21 @@ def __init__(self, *args, **kwargs):
327
327
if 'dimension_separator' in kwargs :
328
328
kwargs .pop ('dimension_separator' )
329
329
warnings .warn ('Keyword argument `dimension_separator` will be ignored' )
330
- dimension_separator = "/ "
330
+ dimension_separator = ". "
331
331
super ().__init__ (* args , dimension_separator = dimension_separator , ** kwargs )
332
332
333
+ def swap_separator (self , key ):
334
+ old = key
335
+ segments = list (key .split ('/' ))
336
+ if segments :
337
+ last_segment = segments [- 1 ]
338
+ if _prog_ckey .match (last_segment ):
339
+ coords = list (last_segment .split ('.' ))
340
+ last_segment = '/' .join (coords [::- 1 ])
341
+ segments = segments [:- 1 ] + [last_segment ]
342
+ key = '/' .join (segments )
343
+ return key
344
+
333
345
def _normalize_key (self , key ):
334
346
if is_chunk_key (key ):
335
347
key = invert_chunk_coords (key )
@@ -339,7 +351,7 @@ def _normalize_key(self, key):
339
351
* bits , end = key .split ("/" )
340
352
341
353
if end not in (self .array_meta_key , self .group_meta_key , self .attrs_key ):
342
- end = end .replace ("." , self . key_separator )
354
+ end = end .replace ("." , "/" )
343
355
key = "/" .join (bits + [end ])
344
356
return key .lower () if self .normalize_keys else key
345
357
@@ -367,6 +379,10 @@ def __getitem__(self, key):
367
379
raise KeyError (key )
368
380
else :
369
381
return json_dumps (value )
382
+
383
+ elif is_chunk_key (key ):
384
+ key = self .swap_separator (key )
385
+
370
386
return super ().__getitem__ (key )
371
387
372
388
def __setitem__ (self , key , value ):
@@ -411,6 +427,9 @@ def __setitem__(self, key, value):
411
427
412
428
value = json_dumps (n5_attrs )
413
429
430
+ elif is_chunk_key (key ):
431
+ key = self .swap_separator (key )
432
+
414
433
super ().__setitem__ (key , value )
415
434
416
435
def __delitem__ (self , key ):
@@ -421,6 +440,8 @@ def __delitem__(self, key):
421
440
key = key .replace (zarr_array_meta_key , self .array_meta_key )
422
441
elif key .endswith (zarr_attrs_key ): # pragma: no cover
423
442
key = key .replace (zarr_attrs_key , self .attrs_key )
443
+ elif is_chunk_key (key ):
444
+ key = self .swap_separator (key )
424
445
425
446
super ().__delitem__ (key )
426
447
@@ -444,6 +465,9 @@ def __contains__(self, key):
444
465
key = key .replace (zarr_attrs_key , self .attrs_key )
445
466
return self ._contains_attrs (key )
446
467
468
+ elif is_chunk_key (key ):
469
+ key = self .swap_separator (key )
470
+
447
471
return super ().__contains__ (key )
448
472
449
473
def __eq__ (self , other ):
@@ -538,19 +562,20 @@ def _contains_attrs(self, path):
538
562
return len (attrs ) > 0
539
563
540
564
def is_chunk_key (key ):
565
+ rv = False
541
566
segments = list (key .split ('/' ))
542
567
if segments :
543
568
last_segment = segments [- 1 ]
544
- return _prog_ckey .match (last_segment )
545
- return False # pragma: no cover
569
+ rv = _prog_ckey .match (last_segment )
570
+ return rv
546
571
547
572
def invert_chunk_coords (key ):
548
573
segments = list (key .split ('/' ))
549
574
if segments :
550
575
last_segment = segments [- 1 ]
551
576
if _prog_ckey .match (last_segment ):
552
577
coords = list (last_segment .split ('.' ))
553
- last_segment = '. ' .join (coords [::- 1 ])
578
+ last_segment = '/ ' .join (coords [::- 1 ])
554
579
segments = segments [:- 1 ] + [last_segment ]
555
580
key = '/' .join (segments )
556
581
return key
@@ -627,7 +652,7 @@ def array_metadata_to_zarr(array_metadata):
627
652
array_metadata ['fill_value' ] = 0 # also if None was requested
628
653
array_metadata ['order' ] = 'C'
629
654
array_metadata ['filters' ] = []
630
- array_metadata ['dimension_separator' ] = '/ '
655
+ array_metadata ['dimension_separator' ] = '. '
631
656
632
657
compressor_config = array_metadata ['compressor' ]
633
658
compressor_config = compressor_config_to_zarr (compressor_config )
0 commit comments