import zarr def convert_attrs(z2,z3): z3.attrs.update(z2.attrs.asdict()) def convert_variable(v2,z3): compressors = zarr.codecs.BloscCodec(cname=v2.compressor.cname, clevel=v2.compressor.clevel, shuffle=zarr.codecs.BloscShuffle.shuffle.from_int(v2.compressor.shuffle),blocksize=v2.compressor.blocksize) v3 = z3.create_array( name=v2.name, shape=v2.shape, dtype=v2.dtype, compressors=compressors, chunks=v2.chunks, shards=v2.shards, order=v2.order, fill_value=v2.fill_value, dimension_names=v2.attrs.get('_ARRAY_DIMENSIONS'), overwrite=True ) v3[:]=v2[:] convert_attrs(v2,v3) def convert_groups(g2,g3): convert_attrs(g2,g3) for vname,v2 in g2.arrays(): convert_variable(v2,g3) for g2 in g2.groups(): convert_groups(g2,g3) def convert_zarr(z2,z3): convert_groups(z2,z3) zarr.consolidate_metadata(z3.store) if __name__ == '__main__': import sys if not len(sys.argv) in (2,3): print('Usage: {} <input.zarr> [<output.zarr>]'.format(sys.argv[0])) sys.exit(1) input_zarr = sys.argv[1] output_zarr = sys.argv[2] if len(sys.argv) == 3 else input_zarr + '3' z2 = zarr.open(input_zarr,mode='r') z3 = zarr.open(output_zarr,mode='w') convert_zarr(z2,z3)