# 8.13 `stat` -- Interpreting `stat()` results

Availability: Unix, Windows.

The `stat` module defines constants and functions for interpreting the results of `os.stat()` and `os.lstat()` (if they exist). For complete details about the `stat()` and `lstat()` system calls, consult your local man pages.

The `stat` module defines the following functions:

`S_ISDIR` (mode)
  Return non-zero if the mode was gotten from a directory.

`S_ISCHR` (mode)
  Return non-zero if the mode was gotten from a character special device.

`S_ISBLK` (mode)
  Return non-zero if the mode was gotten from a block special device.

`S_ISREG` (mode)
  Return non-zero if the mode was gotten from a regular file.

`S_ISFIFO` (mode)
  Return non-zero if the mode was gotten from a FIFO.

`S_ISLNK` (mode)
  Return non-zero if the mode was gotten from a symbolic link.

`S_ISSOCK` (mode)
  Return non-zero if the mode was gotten from a socket.

All the data items below are simply symbolic indexes into the 10-tuple returned by `os.stat()` or `os.lstat()`.

`ST_MODE`
  Inode protection mode.

`ST_INO`
  Inode number.

`ST_DEV`
  Device inode resides on.

`ST_NLINK`
  Number of links to the inode.

`ST_UID`
  User id of the owner.

`ST_GID`
  Group id of the owner.

`ST_SIZE`
  File size in bytes.

`ST_ATIME`
  Time of last access.

`ST_MTIME`
  Time of last modification.

`ST_CTIME`
  Time of last status change (see manual pages for details).

Example:

      import os, sys
      from stat import *

      def process(dir, func):
          '''recursively descend the directory rooted at dir, calling func for
             each regular file'''

          for f in os.listdir(dir):
              mode = os.stat('%s/%s' % (dir, f))[ST_MODE]
      if S_ISDIR(mode):
                  # recurse into directory
                  process('%s/%s' % (dir, f), func)
      elif S_ISREG(mode):
                  func('%s/%s' % (dir, f))
      else:
                  print 'Skipping %s/%s' % (dir, f)

      def f(file):
          print 'frobbed', file

      if __name__ == '__main__':
          process(sys.argv[1], f)