| Fred Drake | 449e18f | 1998-12-28 20:16:58 +0000 | [diff] [blame] | 1 | \section{\module{shutil} --- | 
| Fred Drake | dbd72a4 | 1999-02-01 21:27:59 +0000 | [diff] [blame] | 2 |          High-level file operations} | 
| Fred Drake | 449e18f | 1998-12-28 20:16:58 +0000 | [diff] [blame] | 3 |  | 
 | 4 | \declaremodule{standard}{shutil} | 
| Fred Drake | dbd72a4 | 1999-02-01 21:27:59 +0000 | [diff] [blame] | 5 | \modulesynopsis{High-level file operations, including copying.} | 
| Fred Drake | 449e18f | 1998-12-28 20:16:58 +0000 | [diff] [blame] | 6 | \sectionauthor{Fred L. Drake, Jr.}{fdrake@acm.org} | 
 | 7 | % partly based on the docstrings | 
 | 8 |  | 
 | 9 |  | 
 | 10 | The \module{shutil} module offers a number of high-level operations on | 
 | 11 | files and collections of files.  In particular, functions are provided  | 
 | 12 | which support file copying and removal. | 
| Fred Drake | 94c4a79 | 1998-12-28 21:58:57 +0000 | [diff] [blame] | 13 | \index{file!copying} | 
 | 14 | \index{copying files} | 
| Fred Drake | 449e18f | 1998-12-28 20:16:58 +0000 | [diff] [blame] | 15 |  | 
 | 16 | \strong{Caveat:}  On MacOS, the resource fork and other metadata are | 
 | 17 | not used.  For file copies, this means that resources will be lost and  | 
 | 18 | file type and creator codes will not be correct. | 
 | 19 |  | 
 | 20 |  | 
 | 21 | \begin{funcdesc}{copyfile}{src, dst} | 
| Fred Drake | 043d5e5 | 2001-03-02 16:46:42 +0000 | [diff] [blame] | 22 |   Copy the contents of the file named \var{src} to a file named | 
 | 23 |   \var{dst}.  If \var{dst} exists, it will be replaced, otherwise it | 
 | 24 |   will be created. | 
| Fred Drake | 449e18f | 1998-12-28 20:16:58 +0000 | [diff] [blame] | 25 | \end{funcdesc} | 
 | 26 |  | 
| Fred Drake | 578a3f9 | 2000-07-31 15:45:46 +0000 | [diff] [blame] | 27 | \begin{funcdesc}{copyfileobj}{fsrc, fdst\optional{, length}} | 
 | 28 |   Copy the contents of the file-like object \var{fsrc} to the | 
 | 29 |   file-like object \var{fdst}.  The integer \var{length}, if given, | 
 | 30 |   is the buffer size. In particular, a negative \var{length} value | 
 | 31 |   means to copy the data without looping over the source data in | 
 | 32 |   chunks; by default the data is read in chunks to avoid uncontrolled | 
 | 33 |   memory consumption. | 
 | 34 | \end{funcdesc} | 
 | 35 |  | 
| Fred Drake | 449e18f | 1998-12-28 20:16:58 +0000 | [diff] [blame] | 36 | \begin{funcdesc}{copymode}{src, dst} | 
 | 37 |   Copy the permission bits from \var{src} to \var{dst}.  The file | 
 | 38 |   contents, owner, and group are unaffected. | 
 | 39 | \end{funcdesc} | 
 | 40 |  | 
 | 41 | \begin{funcdesc}{copystat}{src, dst} | 
 | 42 |   Copy the permission bits, last access time, and last modification | 
 | 43 |   time from \var{src} to \var{dst}.  The file contents, owner, and | 
 | 44 |   group are unaffected. | 
 | 45 | \end{funcdesc} | 
 | 46 |  | 
 | 47 | \begin{funcdesc}{copy}{src, dst} | 
 | 48 |   Copy the file \var{src} to the file or directory \var{dst}.  If | 
 | 49 |   \var{dst} is a directory, a file with the same basename as \var{src}  | 
 | 50 |   is created (or overwritten) in the directory specified.  Permission | 
 | 51 |   bits are copied. | 
 | 52 | \end{funcdesc} | 
 | 53 |  | 
 | 54 | \begin{funcdesc}{copy2}{src, dst} | 
 | 55 |   Similar to \function{copy()}, but last access time and last | 
 | 56 |   modification time are copied as well.  This is similar to the | 
| Fred Drake | d290c10 | 1999-11-09 18:03:00 +0000 | [diff] [blame] | 57 |   \UNIX{} command \program{cp} \programopt{-p}. | 
| Fred Drake | 449e18f | 1998-12-28 20:16:58 +0000 | [diff] [blame] | 58 | \end{funcdesc} | 
 | 59 |  | 
 | 60 | \begin{funcdesc}{copytree}{src, dst\optional{, symlinks}} | 
 | 61 |   Recursively copy an entire directory tree rooted at \var{src}.  The | 
 | 62 |   destination directory, named by \var{dst}, must not already exist; | 
 | 63 |   it will be created.  Individual files are copied using | 
 | 64 |   \function{copy2()}.  If \var{symlinks} is true, symbolic links in | 
 | 65 |   the source tree are represented as symbolic links in the new tree; | 
 | 66 |   if false or omitted, the contents of the linked files are copied to | 
 | 67 |   the new tree.  Errors are reported to standard output. | 
 | 68 |  | 
 | 69 |   The source code for this should be considered an example rather than  | 
 | 70 |   a tool. | 
 | 71 | \end{funcdesc} | 
 | 72 |  | 
 | 73 | \begin{funcdesc}{rmtree}{path\optional{, ignore_errors\optional{, onerror}}} | 
| Fred Drake | 94c4a79 | 1998-12-28 21:58:57 +0000 | [diff] [blame] | 74 | \index{directory!deleting} | 
| Fred Drake | 449e18f | 1998-12-28 20:16:58 +0000 | [diff] [blame] | 75 |   Delete an entire directory tree.  If \var{ignore_errors} is true, | 
 | 76 |   errors will be ignored; if false or omitted, errors are handled by | 
 | 77 |   calling a handler specified by \var{onerror} or raise an exception. | 
 | 78 |  | 
 | 79 |   If \var{onerror} is provided, it must be a callable that accepts | 
 | 80 |   three parameters: \var{function}, \var{path}, and \var{excinfo}. | 
 | 81 |   The first parameter, \var{function}, is the function which raised | 
 | 82 |   the exception; it will be \function{os.remove()} or | 
 | 83 |   \function{os.rmdir()}.  The second parameter, \var{path}, will be | 
 | 84 |   the path name passed to \var{function}.  The third parameter, | 
 | 85 |   \var{excinfo}, will be the exception information return by | 
 | 86 |   \function{sys.exc_info()}.  Exceptions raised by \var{onerror} will | 
 | 87 |   not be caught. | 
 | 88 | \end{funcdesc} | 
 | 89 |  | 
 | 90 |  | 
 | 91 | \subsection{Example \label{shutil-example}} | 
 | 92 |  | 
 | 93 | This example is the implementation of the \function{copytree()} | 
| Fred Drake | 11bc8cf | 1999-04-21 17:08:51 +0000 | [diff] [blame] | 94 | function, described above, with the docstring omitted.  It | 
 | 95 | demonstrates many of the other functions provided by this module. | 
| Fred Drake | 449e18f | 1998-12-28 20:16:58 +0000 | [diff] [blame] | 96 |  | 
 | 97 | \begin{verbatim} | 
 | 98 | def copytree(src, dst, symlinks=0): | 
 | 99 |     names = os.listdir(src) | 
 | 100 |     os.mkdir(dst) | 
 | 101 |     for name in names: | 
 | 102 |         srcname = os.path.join(src, name) | 
 | 103 |         dstname = os.path.join(dst, name) | 
 | 104 |         try: | 
 | 105 |             if symlinks and os.path.islink(srcname): | 
 | 106 |                 linkto = os.readlink(srcname) | 
 | 107 |                 os.symlink(linkto, dstname) | 
 | 108 |             elif os.path.isdir(srcname): | 
 | 109 |                 copytree(srcname, dstname) | 
 | 110 |             else: | 
 | 111 |                 copy2(srcname, dstname) | 
 | 112 |             # XXX What about devices, sockets etc.? | 
 | 113 |         except (IOError, os.error), why: | 
 | 114 |             print "Can't copy %s to %s: %s" % (`srcname`, `dstname`, str(why)) | 
 | 115 | \end{verbatim} |