OS模块简介:

OS模块是Python标准库中的一个用于访问操作系统功能的模块,OS模块提供了一种可移植的方法使用操作系统的功能。使用OS模块中提供的接口,可以实现跨平台访问。但是在OS模块中的接口并不是所有平台都通用,有些接口的实现是依靠特定平台下的接口的。在OS模块中提供了一系列访问操作系统功能的接口,便于编写跨平台的应用。

在使用OS模块的时候,如果需要获取系统的名字,可以使用 os.name 获取抛入这个模块的系统的名称,如果是在windows平台下,则返回‘nt’,在Linux则返回‘posix’。

以下是一些常用的os模块命令

1、os.getcwd():获取当前工作目录;若是运行脚本则是当前python脚本工作的目录路径;

#直接在python3接口下运行
[root@localhost ~]# python3
Python 3.6.1 (default, Jun 26 2017, 10:18:59) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getcwd()
'/root'
>>> exit() 
[root@localhost ~]# pwd
/root
#脚本运行
[root@localhost ~]# cat python_os.py 
#!/usr/bin/python3
import os
print(os.getcwd())
执行结果:
[root@localhost ~]# ./python_os.py 
/root

2、os.chdir("dir_name") 改变当前脚本工作目录;相当于shell下cd

>>> import os
>>> os.getcwd()
'/root'
>>> os.chdir("/tmp/")
>>> os.getcwd()
'/tmp'

3、os.curdir 返回当前目录: ('.')

>>> import os
>>> os.getcwd()
'/root'
>>> os.curdir
'.'

4、os.pardir 获取当前目录的父目录字符串名:('..')

>>> os.pardir      
'..'

5、os.makedirs('dirname1/dirname2') :可生成多层递归目录

>>> import os
>>> os.getcwd()
'/root'
>>> os.makedirs("./pytest1/pytest2")    #创建多层目录
>>> os.chdir("./pytest1/pytest2")    #进入创建好的目录当中
>>> os.getcwd()
'/root/pytest1/pytest2'

6、os.removedirs('dirname1') :若目录为空,则删除;并递归到上一级目录,如果此级目录也为空,也删除,依此类推

#!/usr/bin/python3

import os
os.chdir("/tmp")
print(os.getcwd())
os.makedirs("/tmp/test1/test2/test3")
print(os.system("tree"))    #打印为删除目录前的的目录结构
os.system("cp /etc/issue ./test1")    #os.system("command")可以运行系统命令
os.removedirs("/tmp/test1/test2/test3")    #删除/tmp/test1/test2/test3;因为test2/test3均为空目录,所以会被删除,而test1不是空目录,所以删除目录到test1就会结束
print(os.system("tree"))    #打印删除目录后的目录结构
执行结果:
/tmp
.
├── pytest.py
└── test1
    └── test2
        └── test3

3 directories, 1 file
0
.
├── pytest.py
└── test1
    └── issue

1 directory, 2 files
0

7、os.mkdir('dirname') :生成单级目录;相当于shell中mkdir dirname

   os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname

#!/usr/bin/python3

import os

print(os.getcwd())
os.system("tree")    #查看tmp的目录结构

os.mkdir("one_dir")    #创建单个目录one_dir
os.system("tree")    #查看创建单个目录后的tmp目录结构

os.rmdir("one_dir")    #删除单个目录one_dir
os.system("tree")    #查看删除单个目录后的tmp目录结构
执行结果:
/tmp
.
├── pytest1.py
└── pytest.py

0 directories, 2 files
.
├── one_dir
├── pytest1.py
└── pytest.py

1 directory, 2 files
.
├── pytest1.py
└── pytest.py

8、os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印

#!/usr/bin/python3

import os
print(os.listdir("/"))
#查看/下的所有文件和目录
执行结果:
['boot', 'dev', 'proc', 'run', 'sys', 'etc', 'root', 'var', 'tmp', 'usr', 'bin', 'sbin', 'lib', 'lib64', 'home', 'media', 'mnt', 'opt', 'srv']

9、os.remove() :删除一个文件

#!/usr/bin/python3

import os

os.chdir("/tmp")
os.system("tree")

os.remove("./test1/issue")    #删除/tmp/test1/issue文件
os.system("tree")
执行结果:
[root@localhost tmp]# ./pytest4.py 
.
├── pytest1.py
├── pytest2.py
├── pytest4.py
├── pytest.py
└── test1
    ├── issue
    └── test2

2 directories, 5 files
.
├── pytest1.py
├── pytest2.py
├── pytest4.py
├── pytest.py
└── test1
    └── test2

10、os.rename("oldname","newname") :重命名文件/目录

#!/usr/bin/python3

import os
os.chdir("/tmp")
os.system("cp /etc/issue ./test1")
os.system("tree")

os.rename("./test1/issue","./test1/py_issue")    #修改issue文件名
os.rename("test1","py_test1")    #修改test1的目录名
os.system("tree")
执行结果:
.
├── pytest1.py
├── pytest2.py
├── pytest4.py
├── pytest5.py
├── pytest.py
└── test1
    ├── issue
    └── test2

2 directories, 6 files
.
├── py_test1
│   ├── py_issue
│   └── test2
├── pytest1.py
├── pytest2.py
├── pytest4.py
├── pytest5.py
└── pytest.py

2 directories, 6 files

11、os.stat('path/filename') 获取文件/目录信息

#!/usr/bin/python3

import os

dir_stat = os.stat("/tmp/py_test1")
file_stat = os.stat("/tmp/pytest1.py")

print(dir_stat)
print(file_stat)
执行结果:
os.stat_result(st_mode=16877, st_ino=748164, st_dev=64768, st_nlink=3, st_uid=0, st_gid=0, st_size=35, st_atime=1498491822, st_mtime=1498491822, st_ctime=1498491822)
os.stat_result(st_mode=33261, st_ino=16788520, st_dev=64768, st_nlink=1, st_uid=0, st_gid=0, st_size=146, st_atime=1498490209, st_mtime=1498490201, st_ctime=1498490201)

12、os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"

linux Centos7:
In [65]: os.sep
Out[65]: '/'
window 7:
>>> os.sep
'\\'
>>>

13、os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"

linux Centos7:
In [66]: os.linesep
Out[66]: '\n'
window 7:
>>> os.linesep
'\r\n'

14、os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'

linux Centos7:
In [68]: os.name
Out[68]: 'posix'
windows 7:
>>> os.name
'nt'

15、os.system("bash command") :运行shell命令,直接显示命令运行结果;并且成功后return 0。

#!/usr/bin/python3

import os

#os.system("command")的shell命令运行成功后会return 0,所以print的结果为0,但是command运行的结果会输出到屏幕且无法赋值
print("不赋值执行结果:\n",os.system("df -lh"))
#os.system("command")若做赋值操作的话,则是将return的结果赋给a,
print("{:*^80}".format("赋值"))
a = os.system("df -lh >& /dev/null")
print("赋值执行结果:",a)
执行结果:
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root   17G  2.6G   15G  15% /
devtmpfs             902M     0  902M   0% /dev
tmpfs                912M     0  912M   0% /dev/shm
tmpfs                912M  8.6M  904M   1% /run
tmpfs                912M     0  912M   0% /sys/fs/cgroup
/dev/sda1           1014M  139M  876M  14% /boot
tmpfs                183M     0  183M   0% /run/user/0
不赋值执行结果:
 0
***************************************赋值***************************************
赋值执行结果: 0

 

  

16、os.popen("bash command"):将运行shell命令的结果return

#!/usr/bin/python3

import os
disk_a = os.popen("df -lh")
disk_b = os.popen("df -lh").read()
print("首次读取disk_a结果:\n{}".format(disk_a.read()))
#disk_a是os._wrap_close类型,disk_a再被read后,指针会移动到最后,所以再次读取结果为空
print("再次读取disk_a结果:\n{}".format(disk_a.read()))

print("首次读取disk_b结果:\n{}".format(disk_b))
#相当于disk_a被read后的结果赋值给disk_b;disk_b的类型是str,所以可以被多次读取
print("再次读取disk_b结果:\n{}".format(disk_b))
执行结果:
首次读取disk_a结果:
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root   17G  2.6G   15G  15% /
devtmpfs             902M     0  902M   0% /dev
tmpfs                912M     0  912M   0% /dev/shm
tmpfs                912M  8.6M  904M   1% /run
tmpfs                912M     0  912M   0% /sys/fs/cgroup
/dev/sda1           1014M  139M  876M  14% /boot
tmpfs                183M     0  183M   0% /run/user/0

再次读取disk_a结果:

首次读取disk_b结果:
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root   17G  2.6G   15G  15% /
devtmpfs             902M     0  902M   0% /dev
tmpfs                912M     0  912M   0% /dev/shm
tmpfs                912M  8.6M  904M   1% /run
tmpfs                912M     0  912M   0% /sys/fs/cgroup
/dev/sda1           1014M  139M  876M  14% /boot
tmpfs                183M     0  183M   0% /run/user/0

再次读取disk_b结果:
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root   17G  2.6G   15G  15% /
devtmpfs             902M     0  902M   0% /dev
tmpfs                912M     0  912M   0% /dev/shm
tmpfs                912M  8.6M  904M   1% /run
tmpfs                912M     0  912M   0% /sys/fs/cgroup
/dev/sda1           1014M  139M  876M  14% /boot
tmpfs                183M     0  183M   0% /run/user/0

17、os.environ 获取系统环境变量

#!/usr/bin/python3


import os
a = os.environ
print("Centos7 环境变量:",a)
执行结果:
Centos7 环境变量: environ({'XDG_SESSION_ID': '12', 'HOSTNAME': 'localhost.localdomain', 'SELINUX_ROLE_REQUESTED': '', 'TERM': 'xterm', 'SHELL': '/bin/bash', 'HISTSIZE': '1000', 'SSH_CLIENT': '192.168.1.104 49951 22', 'SELINUX_USE_CURRENT_RANGE': '', 'OLDPWD': '/root', 'SSH_TTY': '/dev/pts/0', 'USER': 'root', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:', 'MAIL': '/var/spool/mail/root', 'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin', 'PWD': '/tmp', 'LANG': 'en_US.UTF-8', 'SELINUX_LEVEL_REQUESTED': '', 'HISTCONTROL': 'ignoredups', 'SHLVL': '1', 'HOME': '/root', 'LOGNAME': 'root', 'SSH_CONNECTION': '192.168.1.104 49951 192.168.1.200 22', 'LESSOPEN': '||/usr/bin/lesspipe.sh %s', 'XDG_RUNTIME_DIR': '/run/user/0', '_': './pytest9.py'})

18、os.path.abspath(path) :返回path规范化的绝对路径

>>> import os
>>> os.path.abspath("/etc/sysconfig/network-script///")
'/etc/sysconfig/network-script'

19、os.path.split(path) :将path分割成目录和文件名二元组返回;或者将path分割最后一个路径分隔符前的目录和分隔符后的目录的二元组返回

#!/usr/bin/python3

import os

path1 = "/etc/sysconfig/network-scripts/"
path2 = "/etc/sysconfig/network-scripts"

print("以路径分隔符结尾且都是目录的分隔:",os.path.split(path1))
print("以文件或目录结尾的分隔:",os.path.split(path2))
执行结果:
以路径分隔符结尾且都是目录的分隔: ('/etc/sysconfig/network-scripts', '')
以文件或目录结尾的分隔: ('/etc/sysconfig', 'network-scripts')

 

20、os.path.dirname(path) :返回path的目录。其实就是os.path.split(path)的第一个元素

#!/usr/bin/python3

import os

path1 = "/etc/sysconfig/network-scripts/"
path2 = "/etc/sysconfig/network-scripts"

print("以路径分隔符结尾且都是目录的分隔:",os.path.dirname(path1))
print("以文件或目录结尾的分隔:",os.path.dirname(path2))
执行结果:
以路径分隔符结尾且都是目录的分隔: /etc/sysconfig/network-scripts 
以文件或目录结尾的分隔: /etc/sysconfig

21、os.path.basename(path) :返回path最后的文件名,即os.path.split(path)的第二个元素。如果path以路径分隔符结尾,那么就会返回空值。

#!/usr/bin/python3

import os

path1 = "/etc/sysconfig/network-scripts/"
path2 = "/etc/sysconfig/network-scripts"

print("以路径分隔符结尾且都是目录的分隔:",os.path.basename(path1))
print("以文件或目录结尾的分隔:",os.path.basename(path2))
执行结果:
以路径分隔符结尾且都是目录的分隔: 
以文件或目录结尾的分隔: network-scripts

22、os.path.exists(path) :如果path存在,返回True;如果path不存在,返回False;用于判断文件或目录是否存在

#!/usr/bin/python3

import os

if not os.path.exists("/etc/sysconfig/netif"):
    print("/etc/sysconfig/netif文件不存在!")
else:
    print("/etc/sysconfig/netif文件存在!")

if os.path.exists("/etc/sysconfig/"):
    print("/etc/sysconfig/目录存在!")
else:
    print("/etc/sysconfig/目录不存在!")
执行结果:
[root@localhost tmp]# ./pytest12.py 
/etc/sysconfig/netif文件不存在!
/etc/sysconfig/目录存在!
#shell命令查看是否正确
[root@localhost tmp]# ls /etc/sysconfig/netif
ls: cannot access /etc/sysconfig/netif: No such file or directory
[root@localhost tmp]# ls /etc/sysconfig/
authconfig  console   crond            firewalld  init              iptables-config  kdump   man-db   netconsole  network-scripts  readonly-root  run-parts  sshd
cbq         cpupower  ebtables-config  grub       ip6tables-config  irqbalance       kernel  modules  network     rdisc            rsyslog        selinux    wpa_supplicant

23、os.path.isabs(path) :如果path是绝对路径,返回True

#!/usr/bin/python3

import os

path1 = "./py_test1/py_issue"
path2 = "/tmp/py_test1/py_issue"

if os.path.isabs(path1):
    print("{}是绝对路径!".format(path1))
else:
    print("{}不是绝对路径!".format(path1))

if os.path.isabs(path2):
    print("{}是绝对路径!".format(path2))
else:
    print("{}不是绝对路径!".format(path2))
执行结果:
./py_test1/py_issue不是绝对路径!
/tmp/py_test1/py_issue是绝对路径!

24、os.path.isfile(path) :如果path是一个存在的文件,返回True。否则返回False

#!/usr/bin/python3

import os

if os.path.isfile("/etc/passwd"):
    print("/etc/passwd文件存在!")
else:
    print("/etc/passwd文件不存在!")
执行结果:
/etc/passwd文件存在!

25、os.path.isdir(path) :如果path是一个存在的目录,则返回True。否则返回False

#!/usr/bin/python3

import os

if os.path.isdir("/etc/sysconfig"):
    print("/etc/sysconfig目录存在!")
else:
    print("/etc/sysconfig目录不存在!")
执行结果:
/etc/sysconfig目录存在!

26、os.path.join(path1[, path2[, ...]]) :将多个路径组合后返回,第一个绝对路径之前的参数将被忽略

#!/usr/bin/python3

import os

path1 = "/"
path2 = "etc"
path3 = "sysconfig"
path4 = "network-script"

print(os.path.join(path1,path2,path3,path4))
执行结果:
/etc/sysconfig/network-script

#中间含有绝对路径
#!/usr/bin/python3

import os

path1 = "/"
path2 = "etc"
path3 = "/sysconfig"
path4 = "network-script"

print(os.path.join(path1,path2,path3,path4))
执行结果:
/sysconfig/network-script

27、os.path.getatime(path) :返回path所指向的文件或者目录的最后存取时间

#!/usr/bin/python3

import os

print(os.path.getatime("/etc/passwd"))
执行结果:
1498506157.930987

28、os.path.getmtime(path) :返回path所指向的文件或者目录的最后修改时间

!/usr/bin/python3

import os

print(os.path.getctime("/etc/passwd"))
执行结果:
1498504616.4216764

 29、os.path.realpath(path)  :返回path的真实路径

#!/usr/bin/env python

import os
import sys

path = sys.argv[0]  #获取执行脚本路径(执行脚本是可能以绝对路径也可能是相对路径)

abspath = os.path.realpath(path)  #将脚本执行路径转换为绝对路径

print(path)
print(abspath)
执行结果:
./pytest25.py
/tmp/pytest25.py