| \section{\module{shutil} --- |
| High-level file operations} |
| |
| \declaremodule{standard}{shutil} |
| \modulesynopsis{High-level file operations, including copying.} |
| \sectionauthor{Fred L. Drake, Jr.}{fdrake@acm.org} |
| % partly based on the docstrings |
| |
| |
| The \module{shutil} module offers a number of high-level operations on |
| files and collections of files. In particular, functions are provided |
| which support file copying and removal. |
| \index{file!copying} |
| \index{copying files} |
| |
| \strong{Caveat:} On MacOS, the resource fork and other metadata are |
| not used. For file copies, this means that resources will be lost and |
| file type and creator codes will not be correct. |
| |
| |
| \begin{funcdesc}{copyfile}{src, dst} |
| Copy the contents of the file named \var{src} to a file named |
| \var{dst}. If \var{dst} exists, it will be replaced, otherwise it |
| will be created. Special files such as character or block devices |
| and pipes cannot not be copied with this function. \var{src} and |
| \var{dst} are path names given as strings. |
| \end{funcdesc} |
| |
| \begin{funcdesc}{copyfileobj}{fsrc, fdst\optional{, length}} |
| Copy the contents of the file-like object \var{fsrc} to the |
| file-like object \var{fdst}. The integer \var{length}, if given, |
| is the buffer size. In particular, a negative \var{length} value |
| means to copy the data without looping over the source data in |
| chunks; by default the data is read in chunks to avoid uncontrolled |
| memory consumption. |
| \end{funcdesc} |
| |
| \begin{funcdesc}{copymode}{src, dst} |
| Copy the permission bits from \var{src} to \var{dst}. The file |
| contents, owner, and group are unaffected. \var{src} and \var{dst} |
| are path names given as strings. |
| \end{funcdesc} |
| |
| \begin{funcdesc}{copystat}{src, dst} |
| Copy the permission bits, last access time, and last modification |
| time from \var{src} to \var{dst}. The file contents, owner, and |
| group are unaffected. \var{src} and \var{dst} are path names given |
| as strings. |
| \end{funcdesc} |
| |
| \begin{funcdesc}{copy}{src, dst} |
| Copy the file \var{src} to the file or directory \var{dst}. If |
| \var{dst} is a directory, a file with the same basename as \var{src} |
| is created (or overwritten) in the directory specified. Permission |
| bits are copied. \var{src} and \var{dst} are path names given as |
| strings. |
| \end{funcdesc} |
| |
| \begin{funcdesc}{copy2}{src, dst} |
| Similar to \function{copy()}, but last access time and last |
| modification time are copied as well. This is similar to the |
| \UNIX{} command \program{cp} \programopt{-p}. |
| \end{funcdesc} |
| |
| \begin{funcdesc}{copytree}{src, dst\optional{, symlinks}} |
| Recursively copy an entire directory tree rooted at \var{src}. The |
| destination directory, named by \var{dst}, must not already exist; |
| it will be created. Individual files are copied using |
| \function{copy2()}. If \var{symlinks} is true, symbolic links in |
| the source tree are represented as symbolic links in the new tree; |
| if false or omitted, the contents of the linked files are copied to |
| the new tree. If exception(s) occur, an Error is raised |
| with a list of reasons. |
| |
| The source code for this should be considered an example rather than |
| a tool. |
| \versionchanged[Error is raised if any exceptions occur during copying, |
| rather than printing a message]{2.3} |
| \end{funcdesc} |
| |
| \begin{funcdesc}{rmtree}{path\optional{, ignore_errors\optional{, onerror}}} |
| Delete an entire directory tree.\index{directory!deleting} |
| If \var{ignore_errors} is true, |
| errors resulting from failed removals will be ignored; if false or |
| omitted, such errors are handled by calling a handler specified by |
| \var{onerror} or, if that is omitted, they raise an exception. |
| |
| If \var{onerror} is provided, it must be a callable that accepts |
| three parameters: \var{function}, \var{path}, and \var{excinfo}. |
| The first parameter, \var{function}, is the function which raised |
| the exception; it will be \function{os.remove()} or |
| \function{os.rmdir()}. The second parameter, \var{path}, will be |
| the path name passed to \var{function}. The third parameter, |
| \var{excinfo}, will be the exception information return by |
| \function{sys.exc_info()}. Exceptions raised by \var{onerror} will |
| not be caught. |
| \end{funcdesc} |
| |
| \begin{funcdesc}{move}{src, dst} |
| Recursively move a file or directory to another location. |
| |
| If the destination is on our current filesystem, then simply use |
| rename. Otherwise, copy src to the dst and then remove src. |
| |
| \versionadded{2.3} |
| \end{funcdesc} |
| |
| \begin{excdesc}{Error} |
| This exception collects exceptions that raised during a mult-file |
| operation. For \function{copytree}, the exception argument is a |
| list of 3-tuples (\var{srcname}, \var{dstname}, \var{exception}). |
| |
| \versionadded{2.3} |
| \end{excdesc} |
| |
| \subsection{Example \label{shutil-example}} |
| |
| This example is the implementation of the \function{copytree()} |
| function, described above, with the docstring omitted. It |
| demonstrates many of the other functions provided by this module. |
| |
| \begin{verbatim} |
| def copytree(src, dst, symlinks=0): |
| names = os.listdir(src) |
| os.mkdir(dst) |
| for name in names: |
| srcname = os.path.join(src, name) |
| dstname = os.path.join(dst, name) |
| try: |
| if symlinks and os.path.islink(srcname): |
| linkto = os.readlink(srcname) |
| os.symlink(linkto, dstname) |
| elif os.path.isdir(srcname): |
| copytree(srcname, dstname, symlinks) |
| else: |
| copy2(srcname, dstname) |
| except (IOError, os.error), why: |
| print "Can't copy %s to %s: %s" % (`srcname`, `dstname`, str(why)) |
| \end{verbatim} |