折腾一下目录: os.path.<attrib

python在安装的时候,就自带了很多模块,我们把这些模块称之为标准库,其中,有一个是使用频率比较高的,就是 os 。这个库中方法和属性众多,有兴趣的看官可以参考官方文档:https://docs.python.org/2/library/os.html,或者在交互模式中,用dir(os)看一看。

>>> import os   #这个动作很重要,不能缺少
>>> dir(os)
["EX_CANTCREAT", "EX_CONFIG", "EX_DATAERR", "EX_IOERR", "EX_NOHOST", "EX_NOINPUT", "EX_NOPERM", "EX_NOUSER", "EX_OK", "EX_OSERR", "EX_OSFILE", "EX_PROTOCOL", "EX_SOFTWARE", "EX_TEMPFAIL", "EX_UNAVAILABLE", "EX_USAGE", "F_OK", "NGROUPS_MAX", "O_APPEND", "O_ASYNC", "O_CREAT", "O_DIRECT", "O_DIRECTORY", "O_DSYNC", "O_EXCL", "O_LARGEFILE", "O_NDELAY", "O_NOATIME", "O_NOCTTY", "O_NOFOLLOW", "O_NONBLOCK", "O_RDONLY", "O_RDWR", "O_RSYNC", "O_SYNC", "O_TRUNC", "O_WRONLY", "P_NOWAIT", "P_NOWAITO", "P_WAIT", "R_OK", "SEEK_CUR", "SEEK_END", "SEEK_SET", "TMP_MAX", "UserDict", "WCONTINUED", "WCOREDUMP", "WEXITSTATUS", "WIFCONTINUED", "WIFEXITED", "WIFSIGNALED", "WIFSTOPPED", "WNOHANG", "WSTOPSIG", "WTERMSIG", "WUNTRACED", "W_OK", "X_OK", "_Environ", "__all__", "__builtins__", "__doc__", "__file__", "__name__", "__package__", "_copy_reg", "_execvpe", "_exists", "_exit", "_get_exports_list", "_make_stat_result", "_make_statvfs_result", "_pickle_stat_result", "_pickle_statvfs_result", "_spawnvef", "abort", "access", "altsep", "chdir", "chmod", "chown", "chroot", "close", "closerange", "confstr", "confstr_names", "ctermid", "curdir", "defpath", "devnull", "dup", "dup2", "environ", "errno", "error", "execl", "execle", "execlp", "execlpe", "execv", "execve", "execvp", "execvpe", "extsep", "fchdir", "fchmod", "fchown", "fdatasync", "fdopen", "fork", "forkpty", "fpathconf", "fstat", "fstatvfs", "fsync", "ftruncate", "getcwd", "getcwdu", "getegid", "getenv", "geteuid", "getgid", "getgroups", "getloadavg", "getlogin", "getpgid", "getpgrp", "getpid", "getppid", "getresgid", "getresuid", "getsid", "getuid", "initgroups", "isatty", "kill", "killpg", "lchown", "linesep", "link", "listdir", "lseek", "lstat", "major", "makedev", "makedirs", "minor", "mkdir", "mkfifo", "mknod", "name", "nice", "open", "openpty", "pardir", "path", "pathconf", "pathconf_names", "pathsep", "pipe", "popen", "popen2", "popen3", "popen4", "putenv", "read", "readlink", "remove", "removedirs", "rename", "renames", "rmdir", "sep", "setegid", "seteuid", "setgid", "setgroups", "setpgid", "setpgrp", "setregid", "setresgid", "setresuid", "setreuid", "setsid", "setuid", "spawnl", "spawnle", "spawnlp", "spawnlpe", "spawnv", "spawnve", "spawnvp", "spawnvpe", "stat", "stat_float_times", "stat_result", "statvfs", "statvfs_result", "strerror", "symlink", "sys", "sysconf", "sysconf_names", "system", "tcgetpgrp", "tcsetpgrp", "tempnam", "times", "tmpfile", "tmpnam", "ttyname", "umask", "uname", "unlink", "unsetenv", "urandom", "utime", "wait", "wait3", "wait4", "waitpid", "walk", "write"]

在这么多的东西中,本讲只关注os.path,真所谓“弱水三千,只取一瓢”,为什么这么偏爱它呢?因为它和前面已经讲过的文件操作进行配合,就能够随心所欲操作各个地方的文件了(关于文件,请参考:不要红头文件(1)不要红头文件(2)

关于os.path的属性也不少,依然可以用dir(os.path)查看:

>>> dir(os.path)
["__all__", "__builtins__", "__doc__", "__file__", "__name__", "__package__", "_joinrealpath", "_unicode", "_varprog", "abspath", "altsep", "basename", "commonprefix", "curdir", "defpath", "devnull", "dirname", "exists", "expanduser", "expandvars", "extsep", "genericpath", "getatime", "getctime", "getmtime", "getsize", "isabs", "isdir", "isfile", "islink", "ismount", "join", "lexists", "normcase", "normpath", "os", "pardir", "pathsep", "realpath", "relpath", "samefile", "sameopenfile", "samestat", "sep", "split", "splitdrive", "splitext", "stat", "supports_unicode_filenames", "sys", "walk", "warnings"]

这么多属性,看官可以用help()逐个查看有关信息,并了解其使用方法。下面列出常见的几个使用方法,为看官减轻一点阅读英文的障碍,不过,如果看官英语足够好,请直接看原文档。就像这样:

>>> help(os.path.split)

split(p)
    Split a pathname.  Returns tuple "(head, tail)" where "tail" is
    everything after the final slash.  Either part may be empty.

以下将一些典型举例说明:

特别说明,下面的所有操作,均是进入到如下的目录中进行的。

qw@qw-Latitude-E4300:~/Documents/ITArticles/BasicPython/codes$ pwd
/home/qw/Documents/ITArticles/BasicPython/codes         #当前目录

qw@qw-Latitude-E4300:~/Documents/ITArticles/BasicPython/codes$ python

Python 2.7.6 (default, Nov 13 2013, 19:24:16) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

文件的绝对路径

>>> import os.path
>>> os.path.abspath("225.py")
"/home/qw/Documents/ITArticles/BasicPython/codes/225.py"

文件 225.py 是真实存在上述路径中的,得到了该文件的绝对路径。但是,如果随便提供一个不在这个目录中的文件,又如何?

>>> os.path.isfile("225.py")
True

>>> os.path.isfile("2222.py")
False
>>> os.path.abspath("2222.py")
"/home/qw/Documents/ITArticles/BasicPython/codes/2222.py"

os.path.isfile(path),可以判断path中是否是文件,其实是判断在该路径中,是否存在那个文件,如果存在则返回True,否则False。上面的操作发现 2222.py 这个文件在当前目录下是不存在的,但是,用os.path.abspaht("2222.py")能够返回一个绝对路径并带有这个不存在的文件的文件名。这里不妨理解为,如果要建立这个文件,它即将被放在那个位置。

按照这样理解,还可:

>>> os.path.abspath("/home/qw/kkkkkkkk.kk")
"/home/qw/kkkkkkkk.kk"

分开目录和文件名

>>> pn = os.path.abspath("225.py")
>>> pn
"/home/qw/Documents/ITArticles/BasicPython/codes/225.py"

>>> os.path.split(pn)
("/home/qw/Documents/ITArticles/BasicPython/codes", "225.py")
>>> path, filename = os.path.split(pn)[0], os.path.split(pn)[1]
>>> path
"/home/qw/Documents/ITArticles/BasicPython/codes"
>>> filename
"225.py"

os.paht.split(),参数是目录加文件名,就可以将路径和文件名分开。其实,我看这个功能不是很智能,你看这样

>>> os.path.split("/home/qw")
("/home", "qw")

>>> os.path.split("/home/qw/")
("/home/qw", "")

它就是将最后一组认为是文件名了,即最后一个/后面的就是文件名,所以第二个实验中,文件名是空了。是不是有点傻呢?

同样,参数中的文件或者目录,不一定是你的电脑中真实存在的,请看:

>>> os.path.split("/foo/python/qiwsir/git.git")
("/foo/python/qiwsir", "git.git")

只要符合目录书写结构,就可以分解了。

有另外两个属性,是os.path.split()的分别执行,即可以分别获得路径和文件名,这样让操作更简单了。

>>> os.path.dirname("/foo/python/qiwsir/git.git")
"/foo/python/qiwsir"
>>> os.path.basename("foo/python/qiwsir/git.git")
"git.git"

判断

前面稍微提到了os.path.isfile()可以用来判断一个文件是否存在,那么判断目录路径是否存在,可否?可:

>>> os.path.exists("/foo/python/qiwsir")  
False
>>> os.path.exists("/home/qw/Documents")
True

判断相关的属性还有:

  • os.path.isabs(path):判断path是否为绝对路径
  • os.paht.isdir(path):判断path是否为存在的目录

组合路径

将两个或多个对象组合起来,是常见的事情,那么如何将多个路径组合呢?如下:

>>> os.path.join("/home/python","/BasicsPython","226.md")
"/BasicsPython/226.md"

特别提醒,这个属性的返回值中,将第一个绝对路径忽略。

>>> os.path.join("/","/home/qw","learnpython.md")
"/home/qw/learnpython.md"
文章导航