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\’