• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1:mod:`shutil` --- High-level file operations
2============================================
3
4.. module:: shutil
5   :synopsis: High-level file operations, including copying.
6.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
7.. partly based on the docstrings
8
9.. index::
10   single: file; copying
11   single: copying files
12
13**Source code:** :source:`Lib/shutil.py`
14
15--------------
16
17The :mod:`shutil` module offers a number of high-level operations on files and
18collections of files.  In particular, functions are provided  which support file
19copying and removal. For operations on individual files, see also the
20:mod:`os` module.
21
22.. warning::
23
24   Even the higher-level file copying functions (:func:`shutil.copy`,
25   :func:`shutil.copy2`) can't copy all file metadata.
26
27   On POSIX platforms, this means that file owner and group are lost as well
28   as ACLs.  On Mac OS, the resource fork and other metadata are not used.
29   This means that resources will be lost and file type and creator codes will
30   not be correct. On Windows, file owners, ACLs and alternate data streams
31   are not copied.
32
33
34.. _file-operations:
35
36Directory and files operations
37------------------------------
38
39.. function:: copyfileobj(fsrc, fdst[, length])
40
41   Copy the contents of the file-like object *fsrc* to the file-like object *fdst*.
42   The integer *length*, if given, is the buffer size. In particular, a negative
43   *length* value means to copy the data without looping over the source data in
44   chunks; by default the data is read in chunks to avoid uncontrolled memory
45   consumption. Note that if the current file position of the *fsrc* object is not
46   0, only the contents from the current file position to the end of the file will
47   be copied.
48
49
50.. function:: copyfile(src, dst)
51
52   Copy the contents (no metadata) of the file named *src* to a file named
53   *dst*.  *dst* must be the complete target file name; look at
54   :func:`shutil.copy` for a copy that accepts a target directory path.  If
55   *src* and *dst* are the same files, :exc:`Error` is raised.
56   The destination location must be writable; otherwise,  an :exc:`IOError` exception
57   will be raised. If *dst* already exists, it will be replaced.   Special files
58   such as character or block devices and pipes cannot be copied with this
59   function.  *src* and *dst* are path names given as strings.
60
61
62.. function:: copymode(src, dst)
63
64   Copy the permission bits from *src* to *dst*.  The file contents, owner, and
65   group are unaffected.  *src* and *dst* are path names given as strings.
66
67
68.. function:: copystat(src, dst)
69
70   Copy the permission bits, last access time, last modification time, and flags
71   from *src* to *dst*.  The file contents, owner, and group are unaffected.  *src*
72   and *dst* are path names given as strings.
73
74
75.. function:: copy(src, dst)
76
77   Copy the file *src* to the file or directory *dst*.  If *dst* is a directory, a
78   file with the same basename as *src*  is created (or overwritten) in the
79   directory specified.  Permission bits are copied.  *src* and *dst* are path
80   names given as strings.
81
82
83.. function:: copy2(src, dst)
84
85   Similar to :func:`shutil.copy`, but metadata is copied as well -- in fact,
86   this is just :func:`shutil.copy` followed by :func:`copystat`.  This is
87   similar to the Unix command :program:`cp -p`.
88
89
90.. function:: ignore_patterns(\*patterns)
91
92   This factory function creates a function that can be used as a callable for
93   :func:`copytree`\'s *ignore* argument, ignoring files and directories that
94   match one of the glob-style *patterns* provided.  See the example below.
95
96   .. versionadded:: 2.6
97
98
99.. function:: copytree(src, dst, symlinks=False, ignore=None)
100
101   Recursively copy an entire directory tree rooted at *src*.  The destination
102   directory, named by *dst*, must not already exist; it will be created as
103   well as missing parent directories.  Permissions and times of directories
104   are copied with :func:`copystat`, individual files are copied using
105   :func:`shutil.copy2`.
106
107   If *symlinks* is true, symbolic links in the source tree are represented as
108   symbolic links in the new tree, but the metadata of the original links is NOT
109   copied; if false or omitted, the contents and metadata of the linked files
110   are copied to the new tree.
111
112   If *ignore* is given, it must be a callable that will receive as its
113   arguments the directory being visited by :func:`copytree`, and a list of its
114   contents, as returned by :func:`os.listdir`.  Since :func:`copytree` is
115   called recursively, the *ignore* callable will be called once for each
116   directory that is copied.  The callable must return a sequence of directory
117   and file names relative to the current directory (i.e. a subset of the items
118   in its second argument); these names will then be ignored in the copy
119   process.  :func:`ignore_patterns` can be used to create such a callable that
120   ignores names based on glob-style patterns.
121
122   If exception(s) occur, an :exc:`Error` is raised with a list of reasons.
123
124   The source code for this should be considered an example rather than the
125   ultimate tool.
126
127   .. versionchanged:: 2.3
128      :exc:`Error` is raised if any exceptions occur during copying, rather than
129      printing a message.
130
131   .. versionchanged:: 2.5
132      Create intermediate directories needed to create *dst*, rather than raising an
133      error. Copy permissions and times of directories using :func:`copystat`.
134
135   .. versionchanged:: 2.6
136      Added the *ignore* argument to be able to influence what is being copied.
137
138
139.. function:: rmtree(path[, ignore_errors[, onerror]])
140
141   .. index:: single: directory; deleting
142
143   Delete an entire directory tree; *path* must point to a directory (but not a
144   symbolic link to a directory).  If *ignore_errors* is true, errors resulting
145   from failed removals will be ignored; if false or omitted, such errors are
146   handled by calling a handler specified by *onerror* or, if that is omitted,
147   they raise an exception.
148
149   If *onerror* is provided, it must be a callable that accepts three
150   parameters: *function*, *path*, and *excinfo*. The first parameter,
151   *function*, is the function which raised the exception; it will be
152   :func:`os.path.islink`, :func:`os.listdir`, :func:`os.remove` or
153   :func:`os.rmdir`.  The second parameter, *path*, will be the path name passed
154   to *function*.  The third parameter, *excinfo*, will be the exception
155   information return by :func:`sys.exc_info`.  Exceptions raised by *onerror*
156   will not be caught.
157
158   .. versionchanged:: 2.6
159      Explicitly check for *path* being a symbolic link and raise :exc:`OSError`
160      in that case.
161
162
163.. function:: move(src, dst)
164
165   Recursively move a file or directory (*src*) to another location (*dst*).
166
167   If the destination is an existing directory, then *src* is moved inside that
168   directory. If the destination already exists but is not a directory, it may
169   be overwritten depending on :func:`os.rename` semantics.
170
171   If the destination is on the current filesystem, then :func:`os.rename` is
172   used.  Otherwise, *src* is copied (using :func:`shutil.copy2`) to *dst* and
173   then removed.
174
175   .. versionadded:: 2.3
176
177
178.. exception:: Error
179
180   This exception collects exceptions that are raised during a multi-file
181   operation. For :func:`copytree`, the exception argument is a list of 3-tuples
182   (*srcname*, *dstname*, *exception*).
183
184   .. versionadded:: 2.3
185
186
187.. _copytree-example:
188
189copytree example
190::::::::::::::::
191
192This example is the implementation of the :func:`copytree` function, described
193above, with the docstring omitted.  It demonstrates many of the other functions
194provided by this module. ::
195
196   def copytree(src, dst, symlinks=False, ignore=None):
197       names = os.listdir(src)
198       if ignore is not None:
199           ignored_names = ignore(src, names)
200       else:
201           ignored_names = set()
202
203       os.makedirs(dst)
204       errors = []
205       for name in names:
206           if name in ignored_names:
207               continue
208           srcname = os.path.join(src, name)
209           dstname = os.path.join(dst, name)
210           try:
211               if symlinks and os.path.islink(srcname):
212                   linkto = os.readlink(srcname)
213                   os.symlink(linkto, dstname)
214               elif os.path.isdir(srcname):
215                   copytree(srcname, dstname, symlinks, ignore)
216               else:
217                   copy2(srcname, dstname)
218               # XXX What about devices, sockets etc.?
219           except (IOError, os.error) as why:
220               errors.append((srcname, dstname, str(why)))
221           # catch the Error from the recursive copytree so that we can
222           # continue with other files
223           except Error as err:
224               errors.extend(err.args[0])
225       try:
226           copystat(src, dst)
227       except WindowsError:
228           # can't copy file access times on Windows
229           pass
230       except OSError as why:
231           errors.extend((src, dst, str(why)))
232       if errors:
233           raise Error(errors)
234
235Another example that uses the :func:`ignore_patterns` helper::
236
237   from shutil import copytree, ignore_patterns
238
239   copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
240
241This will copy everything except ``.pyc`` files and files or directories whose
242name starts with ``tmp``.
243
244Another example that uses the *ignore* argument to add a logging call::
245
246   from shutil import copytree
247   import logging
248
249   def _logpath(path, names):
250       logging.info('Working in %s' % path)
251       return []   # nothing will be ignored
252
253   copytree(source, destination, ignore=_logpath)
254
255
256.. _archiving-operations:
257
258Archiving operations
259--------------------
260
261High-level utilities to create and read compressed and archived files are also
262provided.  They rely on the :mod:`zipfile` and :mod:`tarfile` modules.
263
264.. function:: make_archive(base_name, format, [root_dir, [base_dir, [verbose, [dry_run, [owner, [group, [logger]]]]]]])
265
266   Create an archive file (eg. zip or tar) and returns its name.
267
268   *base_name* is the name of the file to create, including the path, minus
269   any format-specific extension. *format* is the archive format: one of
270   "zip" (if the :mod:`zlib` module or external ``zip`` executable is
271   available), "tar", "gztar" (if the :mod:`zlib` module is available), or
272   "bztar" (if the :mod:`bz2` module is available).
273
274   *root_dir* is a directory that will be the root directory of the
275   archive; ie. we typically chdir into *root_dir* before creating the
276   archive.
277
278   *base_dir* is the directory where we start archiving from;
279   ie. *base_dir* will be the common prefix of all files and
280   directories in the archive.
281
282   *root_dir* and *base_dir* both default to the current directory.
283
284   *owner* and *group* are used when creating a tar archive. By default,
285   uses the current owner and group.
286
287   *logger* must be an object compatible with :pep:`282`, usually an instance of
288   :class:`logging.Logger`.
289
290   .. versionadded:: 2.7
291
292
293.. function:: get_archive_formats()
294
295   Return a list of supported formats for archiving.
296   Each element of the returned sequence is a tuple ``(name, description)``.
297
298   By default :mod:`shutil` provides these formats:
299
300   - *zip*: ZIP file (if the :mod:`zlib` module or external ``zip``
301     executable is available).
302   - *tar*: uncompressed tar file.
303   - *gztar*: gzip'ed tar-file (if the :mod:`zlib` module is available).
304   - *bztar*: bzip2'ed tar-file (if the :mod:`bz2` module is available).
305
306   You can register new formats or provide your own archiver for any existing
307   formats, by using :func:`register_archive_format`.
308
309   .. versionadded:: 2.7
310
311
312.. function:: register_archive_format(name, function, [extra_args, [description]])
313
314   Register an archiver for the format *name*. *function* is a callable that
315   will be used to invoke the archiver.
316
317   If given, *extra_args* is a sequence of ``(name, value)`` that will be
318   used as extra keywords arguments when the archiver callable is used.
319
320   *description* is used by :func:`get_archive_formats` which returns the
321   list of archivers. Defaults to an empty list.
322
323   .. versionadded:: 2.7
324
325
326.. function::  unregister_archive_format(name)
327
328   Remove the archive format *name* from the list of supported formats.
329
330   .. versionadded:: 2.7
331
332
333.. _archiving-example:
334
335Archiving example
336:::::::::::::::::
337
338In this example, we create a gzip'ed tar-file archive containing all files
339found in the :file:`.ssh` directory of the user::
340
341    >>> from shutil import make_archive
342    >>> import os
343    >>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
344    >>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))
345    >>> make_archive(archive_name, 'gztar', root_dir)
346    '/Users/tarek/myarchive.tar.gz'
347
348The resulting archive contains:
349
350.. code-block:: shell-session
351
352    $ tar -tzvf /Users/tarek/myarchive.tar.gz
353    drwx------ tarek/staff       0 2010-02-01 16:23:40 ./
354    -rw-r--r-- tarek/staff     609 2008-06-09 13:26:54 ./authorized_keys
355    -rwxr-xr-x tarek/staff      65 2008-06-09 13:26:54 ./config
356    -rwx------ tarek/staff     668 2008-06-09 13:26:54 ./id_dsa
357    -rwxr-xr-x tarek/staff     609 2008-06-09 13:26:54 ./id_dsa.pub
358    -rw------- tarek/staff    1675 2008-06-09 13:26:54 ./id_rsa
359    -rw-r--r-- tarek/staff     397 2008-06-09 13:26:54 ./id_rsa.pub
360    -rw-r--r-- tarek/staff   37192 2010-02-06 18:23:10 ./known_hosts
361