Home | History | Annotate | Download | only in Lib
      1 """
      2 Path operations common to more than one OS
      3 Do not use directly.  The OS specific modules import the appropriate
      4 functions from this module themselves.
      5 """
      6 import os
      7 import stat
      8 
      9 __all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime',
     10            'getsize', 'isdir', 'isfile']
     11 
     12 
     13 try:
     14     _unicode = unicode
     15 except NameError:
     16     # If Python is built without Unicode support, the unicode type
     17     # will not exist. Fake one.
     18     class _unicode(object):
     19         pass
     20 
     21 # Does a path exist?
     22 # This is false for dangling symbolic links on systems that support them.
     23 def exists(path):
     24     """Test whether a path exists.  Returns False for broken symbolic links"""
     25     try:
     26         os.stat(path)
     27     except os.error:
     28         return False
     29     return True
     30 
     31 
     32 # This follows symbolic links, so both islink() and isdir() can be true
     33 # for the same path on systems that support symlinks
     34 def isfile(path):
     35     """Test whether a path is a regular file"""
     36     try:
     37         st = os.stat(path)
     38     except os.error:
     39         return False
     40     return stat.S_ISREG(st.st_mode)
     41 
     42 
     43 # Is a path a directory?
     44 # This follows symbolic links, so both islink() and isdir()
     45 # can be true for the same path on systems that support symlinks
     46 def isdir(s):
     47     """Return true if the pathname refers to an existing directory."""
     48     try:
     49         st = os.stat(s)
     50     except os.error:
     51         return False
     52     return stat.S_ISDIR(st.st_mode)
     53 
     54 
     55 def getsize(filename):
     56     """Return the size of a file, reported by os.stat()."""
     57     return os.stat(filename).st_size
     58 
     59 
     60 def getmtime(filename):
     61     """Return the last modification time of a file, reported by os.stat()."""
     62     return os.stat(filename).st_mtime
     63 
     64 
     65 def getatime(filename):
     66     """Return the last access time of a file, reported by os.stat()."""
     67     return os.stat(filename).st_atime
     68 
     69 
     70 def getctime(filename):
     71     """Return the metadata change time of a file, reported by os.stat()."""
     72     return os.stat(filename).st_ctime
     73 
     74 
     75 # Return the longest prefix of all list elements.
     76 def commonprefix(m):
     77     "Given a list of pathnames, returns the longest common leading component"
     78     if not m: return ''
     79     s1 = min(m)
     80     s2 = max(m)
     81     for i, c in enumerate(s1):
     82         if c != s2[i]:
     83             return s1[:i]
     84     return s1
     85 
     86 # Split a path in root and extension.
     87 # The extension is everything starting at the last dot in the last
     88 # pathname component; the root is everything before that.
     89 # It is always true that root + ext == p.
     90 
     91 # Generic implementation of splitext, to be parametrized with
     92 # the separators
     93 def _splitext(p, sep, altsep, extsep):
     94     """Split the extension from a pathname.
     95 
     96     Extension is everything from the last dot to the end, ignoring
     97     leading dots.  Returns "(root, ext)"; ext may be empty."""
     98 
     99     sepIndex = p.rfind(sep)
    100     if altsep:
    101         altsepIndex = p.rfind(altsep)
    102         sepIndex = max(sepIndex, altsepIndex)
    103 
    104     dotIndex = p.rfind(extsep)
    105     if dotIndex > sepIndex:
    106         # skip all leading dots
    107         filenameIndex = sepIndex + 1
    108         while filenameIndex < dotIndex:
    109             if p[filenameIndex] != extsep:
    110                 return p[:dotIndex], p[dotIndex:]
    111             filenameIndex += 1
    112 
    113     return p, ''
    114