@@ -684,32 +684,70 @@ def copy(source, dest, name=None, shallow=False, without_attrs=False, log=None,
684684
685685 Examples
686686 --------
687- >>> import h5py
688- >>> import zarr
689- >>> import numpy as np
690- >>> source = h5py.File('data/example.h5', mode='w')
691- >>> foo = source.create_group('foo')
692- >>> baz = foo.create_dataset('bar/baz', data=np.arange(100), chunks=(50,))
693- >>> spam = source.create_dataset('spam', data=np.arange(100, 200), chunks=(30,))
694- >>> zarr.tree(source)
695- /
696- ├── foo
697- │ └── bar
698- │ └── baz (100,) int64
699- └── spam (100,) int64
700- >>> dest = zarr.group()
701- >>> from sys import stdout
702- >>> zarr.copy(source['foo'], dest, log=stdout)
703- copy /foo
704- copy /foo/bar
705- copy /foo/bar/baz (100,) int64
706- all done: 3 copied, 0 skipped, 800 bytes copied
707- (3, 0, 800)
708- >>> dest.tree() # N.B., no spam
709- /
710- └── foo
711- └── bar
712- └── baz (100,) int64
687+ Here's an example of copying a group named 'foo' from an HDF5 file to a
688+ Zarr group::
689+
690+ >>> import h5py
691+ >>> import zarr
692+ >>> import numpy as np
693+ >>> source = h5py.File('data/example.h5', mode='w')
694+ >>> foo = source.create_group('foo')
695+ >>> baz = foo.create_dataset('bar/baz', data=np.arange(100), chunks=(50,))
696+ >>> spam = source.create_dataset('spam', data=np.arange(100, 200), chunks=(30,))
697+ >>> zarr.tree(source)
698+ /
699+ ├── foo
700+ │ └── bar
701+ │ └── baz (100,) int64
702+ └── spam (100,) int64
703+ >>> dest = zarr.group()
704+ >>> from sys import stdout
705+ >>> zarr.copy(source['foo'], dest, log=stdout)
706+ copy /foo
707+ copy /foo/bar
708+ copy /foo/bar/baz (100,) int64
709+ all done: 3 copied, 0 skipped, 800 bytes copied
710+ (3, 0, 800)
711+ >>> dest.tree() # N.B., no spam
712+ /
713+ └── foo
714+ └── bar
715+ └── baz (100,) int64
716+ >>> source.close()
717+
718+ The ``if_exists`` parameter provides options for how to handle pre-existing data in
719+ the destination. Here are some examples of these options, also using
720+ ``dry_run=True`` to find out what would happen without actually copying anything::
721+
722+ >>> source = zarr.group()
723+ >>> dest = zarr.group()
724+ >>> baz = source.create_dataset('foo/bar/baz', data=np.arange(100))
725+ >>> spam = source.create_dataset('foo/spam', data=np.arange(1000))
726+ >>> existing_spam = dest.create_dataset('foo/spam', data=np.arange(1000))
727+ >>> from sys import stdout
728+ >>> try:
729+ ... zarr.copy(source['foo'], dest, log=stdout, dry_run=True)
730+ ... except zarr.CopyError as e:
731+ ... print(e)
732+ ...
733+ copy /foo
734+ copy /foo/bar
735+ copy /foo/bar/baz (100,) int64
736+ an object 'spam' already exists in destination '/foo'
737+ >>> zarr.copy(source['foo'], dest, log=stdout, if_exists='replace', dry_run=True)
738+ copy /foo
739+ copy /foo/bar
740+ copy /foo/bar/baz (100,) int64
741+ copy /foo/spam (1000,) int64
742+ dry run: 4 copied, 0 skipped
743+ (4, 0, 0)
744+ >>> zarr.copy(source['foo'], dest, log=stdout, if_exists='skip', dry_run=True)
745+ copy /foo
746+ copy /foo/bar
747+ copy /foo/bar/baz (100,) int64
748+ skip /foo/spam (1000,) int64
749+ dry run: 3 copied, 1 skipped
750+ (3, 1, 0)
713751
714752 """
715753
@@ -978,6 +1016,7 @@ def copy_all(source, dest, shallow=False, without_attrs=False, log=None,
9781016 │ └── bar
9791017 │ └── baz (100,) int64
9801018 └── spam (100,) int64
1019+ >>> source.close()
9811020
9821021 """
9831022
0 commit comments