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