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