\section{\module{stat} --- Interpreting \function{stat()} results} \declaremodule{standard}{stat} \modulesynopsis{Utilities for interpreting the results of \function{os.stat()}, \function{os.lstat()} and \function{os.fstat()}.} \sectionauthor{Skip Montanaro}{skip@automatrix.com} The \module{stat} module defines constants and functions for interpreting the results of \function{os.stat()}, \function{os.fstat()} and \function{os.lstat()} (if they exist). For complete details about the \cfunction{stat()}, \cfunction{fstat()} and \cfunction{lstat()} calls, consult the documentation for your system. The \module{stat} module defines the following functions to test for specific file types: \begin{funcdesc}{S_ISDIR}{mode} Return non-zero if the mode is from a directory. \end{funcdesc} \begin{funcdesc}{S_ISCHR}{mode} Return non-zero if the mode is from a character special device file. \end{funcdesc} \begin{funcdesc}{S_ISBLK}{mode} Return non-zero if the mode is from a block special device file. \end{funcdesc} \begin{funcdesc}{S_ISREG}{mode} Return non-zero if the mode is from a regular file. \end{funcdesc} \begin{funcdesc}{S_ISFIFO}{mode} Return non-zero if the mode is from a FIFO (named pipe). \end{funcdesc} \begin{funcdesc}{S_ISLNK}{mode} Return non-zero if the mode is from a symbolic link. \end{funcdesc} \begin{funcdesc}{S_ISSOCK}{mode} Return non-zero if the mode is from a socket. \end{funcdesc} Two additional functions are defined for more general manipulation of the file's mode: \begin{funcdesc}{S_IMODE}{mode} Return the portion of the file's mode that can be set by \function{os.chmod()}---that is, the file's permission bits, plus the sticky bit, set-group-id, and set-user-id bits (on systems that support them). \end{funcdesc} \begin{funcdesc}{S_IFMT}{mode} Return the portion of the file's mode that describes the file type (used by the \function{S_IS*()} functions above). \end{funcdesc} Normally, you would use the \function{os.path.is*()} functions for testing the type of a file; the functions here are useful when you are doing multiple tests of the same file and wish to avoid the overhead of the \cfunction{stat()} system call for each test. These are also useful when checking for information about a file that isn't handled by \refmodule{os.path}, like the tests for block and character devices. All the variables below are simply symbolic indexes into the 10-tuple returned by \function{os.stat()}, \function{os.fstat()} or \function{os.lstat()}. \begin{datadesc}{ST_MODE} Inode protection mode. \end{datadesc} \begin{datadesc}{ST_INO} Inode number. \end{datadesc} \begin{datadesc}{ST_DEV} Device inode resides on. \end{datadesc} \begin{datadesc}{ST_NLINK} Number of links to the inode. \end{datadesc} \begin{datadesc}{ST_UID} User id of the owner. \end{datadesc} \begin{datadesc}{ST_GID} Group id of the owner. \end{datadesc} \begin{datadesc}{ST_SIZE} Size in bytes of a plain file; amount of data waiting on some special files. \end{datadesc} \begin{datadesc}{ST_ATIME} Time of last access. \end{datadesc} \begin{datadesc}{ST_MTIME} Time of last modification. \end{datadesc} \begin{datadesc}{ST_CTIME} Time of last status change (see manual pages for details). \end{datadesc} The interpretation of ``file size'' changes according to the file type. For plain files this is the size of the file in bytes. For FIFOs and sockets under most flavors of \UNIX{} (including Linux in particular), the ``size'' is the number of bytes waiting to be read at the time of the call to \function{os.stat()}, \function{os.fstat()}, or \function{os.lstat()}; this can sometimes be useful, especially for polling one of these special files after a non-blocking open. The meaning of the size field for other character and block devices varies more, depending on the implementation of the underlying system call. Example: \begin{verbatim} import os, sys from stat import * def walktree(dir, callback): '''recursively descend the directory rooted at dir, calling the callback function for each regular file''' for f in os.listdir(dir): pathname = '%s/%s' % (dir, f) mode = os.stat(pathname)[ST_MODE] if S_ISDIR(mode): # It's a directory, recurse into it walktree(pathname, callback) elif S_ISREG(mode): # It's a file, call the callback function callback(pathname) else: # Unknown file type, print a message print 'Skipping %s' % pathname def visitfile(file): print 'visiting', file if __name__ == '__main__': walktree(sys.argv[1], visitfile) \end{verbatim}