|  | 
 | :mod:`stat` --- Interpreting :func:`stat` results | 
 | ================================================= | 
 |  | 
 | .. module:: stat | 
 |    :synopsis: Utilities for interpreting the results of os.stat(), os.lstat() and os.fstat(). | 
 | .. sectionauthor:: Skip Montanaro <skip@automatrix.com> | 
 |  | 
 |  | 
 | The :mod:`stat` module defines constants and functions for interpreting the | 
 | results of :func:`os.stat`, :func:`os.fstat` and :func:`os.lstat` (if they | 
 | exist).  For complete details about the :cfunc:`stat`, :cfunc:`fstat` and | 
 | :cfunc:`lstat` calls, consult the documentation for your system. | 
 |  | 
 | The :mod:`stat` module defines the following functions to test for specific file | 
 | types: | 
 |  | 
 |  | 
 | .. function:: S_ISDIR(mode) | 
 |  | 
 |    Return non-zero if the mode is from a directory. | 
 |  | 
 |  | 
 | .. function:: S_ISCHR(mode) | 
 |  | 
 |    Return non-zero if the mode is from a character special device file. | 
 |  | 
 |  | 
 | .. function:: S_ISBLK(mode) | 
 |  | 
 |    Return non-zero if the mode is from a block special device file. | 
 |  | 
 |  | 
 | .. function:: S_ISREG(mode) | 
 |  | 
 |    Return non-zero if the mode is from a regular file. | 
 |  | 
 |  | 
 | .. function:: S_ISFIFO(mode) | 
 |  | 
 |    Return non-zero if the mode is from a FIFO (named pipe). | 
 |  | 
 |  | 
 | .. function:: S_ISLNK(mode) | 
 |  | 
 |    Return non-zero if the mode is from a symbolic link. | 
 |  | 
 |  | 
 | .. function:: S_ISSOCK(mode) | 
 |  | 
 |    Return non-zero if the mode is from a socket. | 
 |  | 
 | Two additional functions are defined for more general manipulation of the file's | 
 | mode: | 
 |  | 
 |  | 
 | .. function:: S_IMODE(mode) | 
 |  | 
 |    Return the portion of the file's mode that can be set by :func:`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). | 
 |  | 
 |  | 
 | .. function:: S_IFMT(mode) | 
 |  | 
 |    Return the portion of the file's mode that describes the file type (used by the | 
 |    :func:`S_IS\*` functions above). | 
 |  | 
 | Normally, you would use the :func:`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 :cfunc:`stat` system call | 
 | for each test.  These are also useful when checking for information about a file | 
 | that isn't handled by :mod:`os.path`, like the tests for block and character | 
 | devices. | 
 |  | 
 | All the variables below are simply symbolic indexes into the 10-tuple returned | 
 | by :func:`os.stat`, :func:`os.fstat` or :func:`os.lstat`. | 
 |  | 
 |  | 
 | .. data:: ST_MODE | 
 |  | 
 |    Inode protection mode. | 
 |  | 
 |  | 
 | .. data:: ST_INO | 
 |  | 
 |    Inode number. | 
 |  | 
 |  | 
 | .. data:: ST_DEV | 
 |  | 
 |    Device inode resides on. | 
 |  | 
 |  | 
 | .. data:: ST_NLINK | 
 |  | 
 |    Number of links to the inode. | 
 |  | 
 |  | 
 | .. data:: ST_UID | 
 |  | 
 |    User id of the owner. | 
 |  | 
 |  | 
 | .. data:: ST_GID | 
 |  | 
 |    Group id of the owner. | 
 |  | 
 |  | 
 | .. data:: ST_SIZE | 
 |  | 
 |    Size in bytes of a plain file; amount of data waiting on some special files. | 
 |  | 
 |  | 
 | .. data:: ST_ATIME | 
 |  | 
 |    Time of last access. | 
 |  | 
 |  | 
 | .. data:: ST_MTIME | 
 |  | 
 |    Time of last modification. | 
 |  | 
 |  | 
 | .. data:: ST_CTIME | 
 |  | 
 |    The "ctime" as reported by the operating system.  On some systems (like Unix) is | 
 |    the time of the last metadata change, and, on others (like Windows), is the | 
 |    creation time (see platform documentation for details). | 
 |  | 
 | 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 :func:`os.stat`, | 
 | :func:`os.fstat`, or :func:`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:: | 
 |  | 
 |    import os, sys | 
 |    from stat import * | 
 |  | 
 |    def walktree(top, callback): | 
 |        '''recursively descend the directory tree rooted at top, | 
 |           calling the callback function for each regular file''' | 
 |  | 
 |        for f in os.listdir(top): | 
 |            pathname = os.path.join(top, 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) | 
 |  |