一.概述
开发运维相关支撑系统现今已成为Devops下的一大热门领域,Python在这方面也有着自己独到的优势。这类场景以及其他一些场景下,需要调用一些操作系统的接口,这就涉及到今天要讲述的OS模块和sys模块。
二.OS模块的常见用法
- os.getcwd()
获取当前工作目录。需要注意的是目录的分隔符,windows下是’\\’(有一个转义符),linux下是‘/’1 >>> import os 2 >>> os.getcwd() 3 ‘C:\\Users\\Beyondi‘
- os.chdir(‘dirname’)
改变当前工作目录1 >>> import os 2 >>> os.getcwd() 3 ‘C:\\Users\\Beyondi‘ 4 >>> os.chdir(‘d:\\python‘) 5 >>> os.getcwd() 6 ‘d:\\python‘
- os.curdir
返回当前目录点号1 >>> import os 2 >>> os.curdir 3 ‘.‘
- os.pardir
返回当前目录的父目录字符串’..’1 >>> import os 2 >>> os.pardir 3 ‘..‘
- os.makedirs(‘dirname1/dirname2‘)
生成单层或多层递归目录注意这里有一个前提是具有相应的权限去创建目录,否则会提示拒绝访问之类的错误。1 >>> import os 2 >>> os.listdir(‘D:\\iTudou‘) 3 [‘下载‘, ‘转码‘] 4 >>> os.makedirs(‘D:\\iTudou\\test\\001‘) 5 >>> os.listdir(‘D:\\iTudou‘) 6 [‘test‘, ‘下载‘, ‘转码‘] 7 >>> os.listdir(‘D:\\iTudou\\test‘) 8 [‘001‘]
- os.removedirs(”dirname”)
往上层递归删除空目录,若dirname目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推慎用该命令,虽然删除的是空目录,但是会向上递归,功能太过强大,且有些反人类设计了!1 >>> import os 2 >>> os.listdir(‘d:\\iTudou‘) 3 [‘test‘, ‘test2‘, ‘下载‘, ‘转码‘] 4 >>> os.listdir(‘d:\\iTudou\\test‘) 5 [‘001‘] 6 >>> os.listdir(‘d:\\iTudou\\test\\001‘) 7 [] 8 >>> os.removedirs(‘d:\\iTudou\\test\\001‘) 9 >>> os.listdir(‘d:\\iTudou\\test\\001‘) 10 Traceback (most recent call last): 11 File "<stdin>", line 1, in <module> 12 FileNotFoundError: [WinError 3] 系统找不到指定的路径。: ‘d:\\iTudou\\test\\001‘ 13 >>> os.listdir(‘d:\\iTudou\\test‘) 14 Traceback (most recent call last): 15 File "<stdin>", line 1, in <module> 16 FileNotFoundError: [WinError 3] 系统找不到指定的路径。: ‘d:\\iTudou\\test‘ 17 >>> os.listdir(‘d:\\iTudou‘) 18 [‘test2‘, ‘下载‘, ‘转码‘] 19 >>> os.removedirs(‘d:\\iTudou\\test2‘) 20 >>> os.listdir(‘d:\\iTudou‘) 21 [‘下载‘, ‘转码‘] 22 >>>
如果要递归删除非空目录,还是用shutil.rmtree(path)这个神器把,更符合rm -rf的思路。 - os.mkdir
生成单级目录,相当于linux中的mkdir1 >>> import os 2 >>> os.listdir(‘d:\\iTudou‘) 3 [‘下载‘, ‘转码‘] 4 #最后一层目录的父目录必须已经存在,否则要一级一级去创建 5 >>> os.mkdir(‘d:\\iTudou\\test\\001‘) 6 Traceback (most recent call last): 7 File "<stdin>", line 1, in <module> 8 FileNotFoundError: [WinError 3] 系统找不到指定的路径。: ‘d:\\iTudou\\test\\001‘ 9 >>> os.mkdir(‘d:\\iTudou\\test‘) 10 >>> os.listdir(‘d:\\iTudou‘) 11 [‘test‘, ‘下载‘, ‘转码‘]
- os.rmdir
删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname1 >>> import os 2 >>> os.listdir(‘d:\\iTudou\\test‘) 3 [] 4 >>> os.makedirs(‘d:\\iTudou\\test2\\001‘) 5 >>> os.listdir(‘d:\\iTudou\\test2‘) 6 [‘001‘] 7 >>> os.rmdir(‘d:\\iTudou\\test‘) 8 >>> os.rmdir(‘d:\\iTudou\\test2‘) 9 Traceback (most recent call last): 10 File "<stdin>", line 1, in <module> 11 OSError: [WinError 145] 目录不是空的。: ‘d:\\iTudou\\test2‘
- os.listdir(‘dirname‘)
列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印1 >>> import os 2 >>> os.listdir(‘c:\\users‘) 3 [‘All Users‘, ‘Beyondi‘, ‘Default‘, ‘Default User‘, ‘desktop.ini‘, ‘Public‘]
- os.remove()
删除一个文件1 >>> import os 2 >>> os.listdir(‘D:\\iTudou\\test2‘) 3 [‘1.txt‘] 4 >>> os.remove(‘D:\\iTudou\\test2\\1.txt‘) 5 >>> os.listdir(‘D:\\iTudou\\test2‘) 6 []
- os.rename(‘oldname’,’newname’)
重命名一个文件或目录1 >>> import os 2 >>> os.listdir(‘D:\\iTudou\\test2‘) 3 [‘1.txt‘] 4 >>> os.remove(‘D:\\iTudou\\test2\\1.txt‘) 5 >>> os.listdir(‘D:\\iTudou\\test2‘) 6 [] 7 >>> import os 8 >>> os.listdir(‘D:\\iTudou\\test2‘) 9 [‘002.txt‘] 10 >>> os.rename(‘D:\\iTudou\\test2\\002.txt‘,‘D:\\iTudou\\test2\\001.txt‘) 11 >>> os.listdir(‘D:\\iTudou\\test2‘) 12 [‘001.txt‘] 13 >>> os.rename(‘D:\\iTudou\\test2‘,‘D:\\iTudou\\test1‘) 14 >>> os.listdir(‘D:\\iTudou‘) 15 [‘test1‘, ‘下载‘, ‘转码‘] 16 >>>
- os.stat(‘path/filename‘)
获取文件/目录信息从上述示例程序可看出,os.stat可以的st_mode可以区分文件和目录,只是相关的输出可读性不好。1 >>> import os 2 >>> os.stat(‘D:\\iTudou\\test1‘) 3 os.stat_result(st_mode=16895, st_ino=12384898975275303, st_dev=1716593648, st_nl 4 ink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1519773509, st_mtime=1519773509, 5 st_ctime=1519769974) 6 >>> os.stat(‘D:\\iTudou\\test1\\001.txt‘) 7 os.stat_result(st_mode=33206, st_ino=2251799813691689, st_dev=1716593648, st_nli 8 nk=1, st_uid=0, st_gid=0, st_size=0, st_atime=1519773430, st_mtime=1519773430, s 9 t_ctime=1519773430) 10 >>> os.stat(‘D:\\iTudou‘) 11 os.stat_result(st_mode=16895, st_ino=9851624184877368, st_dev=1716593648, st_nli 12 nk=1, st_uid=0, st_gid=0, st_size=0, st_atime=1519773535, st_mtime=1519773535, s 13 t_ctime=1483872753) 14 >>>
- os.sep
输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"1 >>> import os 2 >>> os.sep 3 ‘\\‘
- os.linesep
输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"1 >>> import os 2 >>> os.linesep 3 ‘\r\n‘
- os.path.sep
输出用于分割文件路径的字符串1 >>> os.path.sep 2 ‘\\‘
- os.name 输出字符串指示当前使用平台。win->‘nt‘; Linux->‘posix‘
1 >>> import os 2 >>> os.name 3 ‘nt‘
- os.system("bash command")
运行shell命令并返回结果1 >>> import os 2 >>> os.system(‘dir‘) 3 驱动器 C 中的卷是 Windows7_OS 4 卷的序列号是 1A68-A0E3 5 6 C:\Users\Maxwell 的目录 7 8 2018/01/24 14:23 <DIR> . 9 2018/01/24 14:23 <DIR> .. 10 2017/08/18 11:29 49 .bash_history
- os.environ
获取系统环境变量1 >>> import os 2 >>> os.environ 3 environ({‘ALLUSERSPROFILE‘: ‘C:\\ProgramData‘, ‘APPDATA‘: ‘C:\\Users\\Maxwell\\A 4 ppData\\Roaming‘, ‘COMMONPROGRAMFILES‘: ‘C:\\Program Files\\Common Files‘, ‘COMM 5 ONPROGRAMFILES(X86)‘: ‘C:\\Program Files (x86)\\Common Files‘, ‘COMMONPROGRAMW64 6 32‘: ‘C:\\Program Files\\Common Files‘, ‘COMMPATH‘: ‘C:\\Program Files\\Lenovo\ 7 Communications Utility‘, ‘COMPUTERNAME‘: ‘MAXWELL-PC‘, ‘COMSPEC‘: ‘C:\\windows\ 8 system32\\cmd.exe‘, ‘CONFIGSETROOT‘: ‘C:\\windows\\ConfigSetRoot‘, ‘FP_NO_HOST_C 9 HECK‘: ‘NO‘, ‘HOMEDRIVE‘: ‘C:‘, ‘HOMEPATH‘: ‘\\Users\\Maxwell‘, ‘LOCALAPPDATA‘: 10 ‘C:\\Users\\Maxwell\\AppData\\Local‘, ‘LOGONSERVER‘: ‘\\\\MAXWELL-PC‘, ‘NUMBER_O 11 F_PROCESSORS‘: ‘4‘, ‘OS‘: ‘Windows_NT‘, ‘PATH‘: ‘C:\\ProgramData\\Oracle\\Java\ 12 javapath;C:\\Program Files (x86)\\Intel\\iCLS Client\\;C:\\Program Files\\Intel 13 \iCLS Client\\;C:\\windows\\system32;C:\\windows;C:\\windows\\System32\\Wbem;C: 14 \windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\Intel\\In 15 tel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Mana 16 gement Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\Intel(R) Managemen 17 t Engine Components\\IPT;C:\\Program Files\\Intel\\Intel(R) Management Engine Co 18 mponents\\IPT;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Pro 19 gram Files\\Lenovo\\Fingerprint Manager Pro\\;C:\\Program Files (x86)\\Common Fi 20 les\\Lenovo;C:\\ProgramData\\Lenovo\\ReadyApps;C:\\Program Files\\Git\\cmd;C:\\P 21 rogram Files\\TortoiseGit\\bin;C:\\Program Files (x86)\\MobaXterm.Pro.9.3\\MobaX 22 term_v9.3;C:\\Program Files (x86)\\SecureCRT6.2.0.195;C:\\Program Files (x86)\\S 23 ecureCRT V6.5.8.380;C:\\Program Files (x86)\\SecureCRTSecureFX_HH_x64_7.0.0.326 24 \App\\VanDyke Clients;C:\\Program Files\\VanDyke Software\\SecureCRT;C:\\Program 25 Files\\Java\\jdk1.8.0_60\\bin;C:\\Program Files\\Intel\\WiFi\\bin\\;C:\\Program 26 Files\\Common Files\\Intel\\WirelessCommon\\;C:\\Program Files (x86)\\python3.6 27 .1\\Scripts\\;C:\\Program Files (x86)\\python3.6.1\\;C:\\Program Files\\Intel\\W 28 iFi\\bin\\;C:\\Program Files\\Common Files\\Intel\\WirelessCommon\\‘, ‘PATHEXT‘: 29 ‘.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC‘, ‘PROCESSOR_ARCHITECTUR 30 E‘: ‘AMD64‘, ‘PROCESSOR_IDENTIFIER‘: ‘Intel64 Family 6 Model 78 Stepping 3, Genu 31 ineIntel‘, ‘PROCESSOR_LEVEL‘: ‘6‘, ‘PROCESSOR_REVISION‘: ‘4e03‘, ‘PROGRAMDATA‘: 32 ‘C:\\ProgramData‘, ‘PROGRAMFILES‘: ‘C:\\Program Files‘, ‘PROGRAMFILES(X86)‘: ‘C: 33 \\Program Files (x86)‘, ‘PROGRAMW6432‘: ‘C:\\Program Files‘, ‘PROMPT‘: ‘$P$G‘, ‘ 34 PSMODULEPATH‘: ‘C:\\windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\‘, ‘PUB 35 LIC‘: ‘C:\\Users\\Public‘, ‘READYAPPS‘: ‘C:\\ProgramData\\Lenovo\\ReadyApps‘, ‘S 36 ESSIONNAME‘: ‘Console‘, ‘SWSHARE‘: ‘C:\\SWSHARE‘, ‘SYSTEMDRIVE‘: ‘C:‘, ‘SYSTEMRO 37 OT‘: ‘C:\\windows‘, ‘TEMP‘: ‘C:\\Users\\Maxwell\\AppData\\Local\\Temp‘, ‘TMP‘: ‘ 38 C:\\Users\\Maxwell\\AppData\\Local\\Temp‘, ‘TVT‘: ‘C:\\Program Files (x86)\\Leno 39 vo‘, ‘TVTCOMMON‘: ‘C:\\Program Files (x86)\\Common Files\\Lenovo‘, ‘USERDOMAIN‘: 40 ‘Maxwell-PC‘, ‘USERNAME‘: ‘Maxwell‘, ‘USERPROFILE‘: ‘C:\\Users\\Maxwell‘, ‘WIND 41 IR‘: ‘C:\\windows‘, ‘WINDOWS_TRACING_FLAGS‘: ‘3‘, ‘WINDOWS_TRACING_LOGFILE‘: ‘C: 42 \\BVTBin\\Tests\\installpackage\\csilogfile.log‘})
- os.path.abspath(path)
返回path规范化的绝对路径1 >>> import os 2 >>> os.path.abspath(‘.‘) 3 ‘C:\\Users\\Maxwell‘
- os.path.split(path)
将path分割成目录和文件名二元组返回,最后一级不管为目录还是具体的文件都作为文件名,前面的路径作为路径1 >>> import os 2 >>> os.path.split(‘C:\\Users\\Maxwell\\CMB\\PB40‘) 3 (‘C:\\Users\\Maxwell\\CMB‘, ‘PB40‘) 4 >>> os.path.isdir(‘C:\\Users\\Maxwell\\CMB\\PB40‘) 5 True 6 >>>
- os.path.dirname(path)
返回path的目录,如果path是相对路径,也返回相对路径,如果path是绝对路径,也返回绝对路径1 >>> import os 2 >>> os.path.dirname(‘.‘) 3 ‘‘ 4 >>> os.getcwd() 5 ‘C:\\Users\\Maxwell‘ 6 >>> os.path.dirname(‘C:\\Users\\Maxwell‘) 7 ‘C:\\Users‘
- os.path.basename(path)
返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素1 >>> import os 2 >>> os.path.basename(‘C:\\Users\\Beyondi‘) 3 ‘Beyondi‘ 4 >>> os.path.basename(‘C:\\Users\\Beyondi\\test.txt‘) 5 ‘test.txt‘
- os.path.exists(path)
如果path存在,返回True;如果path不存在,返回False1 >>> import os 2 >>> os.path.exists(‘C:\\Users\\Beyondi‘) 3 True 4 >>> os.path.exists(‘C:\\Users\\Beyondi007‘) 5 False
- os.path.isabs(path)
如果path是绝对路径,返回True.注意这里只是从形式上判断,不存在的目录不会报错1 >>> import os 2 >>> os.path.isabs(‘.‘) 3 False 4 >>> os.path.isabs(‘C:\\Users\\Beyondi‘) 5 True 6 >>> os.path.isabs(‘C:\\Users\\Beyondi007‘) 7 True 8 >>> os.path.exists(‘C:\\Users\\Beyondi007‘) 9 False
- os.path.isfile(path)
如果path是一个存在的文件,返回True。否则返回False1 >>> import os 2 >>> os.path.isfile(‘C:\\Users\\Beyondi‘) 3 False 4 >>> os.path.isfile(‘C:\\Users\\Beyondi\\test.txt‘) 5 True 6 >>> os.path.isfile(‘C:\\Users\\Beyondi\\test007.txt‘) 7 False
- os.path.isdir(path)
如果path是一个存在的目录,则返回True。否则返回False1 >>> import os 2 >>> os.path.isdir(‘.‘) 3 True 4 >>> os.path.isdir(‘C:\\Users\\Beyondi‘) 5 True 6 >>> os.path.isdir(‘C:\\Users\\Beyondi007‘) 7 False 8 >>> os.path.isdir(‘C:\\Users\\Beyondi\\test.txt‘) 9 False
- os.path.join(path1, path2[, ...]]) 将多个路径(文件名)组合后返回,这里仅仅是完成拼接而已,不会判断路径或文件的真实存在性。
1 >>> import os 2 >>> os.path.join(‘C:\\Users\\Beyondi‘,‘001‘,‘002‘) 3 ‘C:\\Users\\Beyondi\\001\\002‘ 4 >>> os.path.join(‘000‘,‘001‘,‘002‘) 5 ‘000\\001\\002‘ 6 >>> os.path.join(‘0.txt‘,‘1.txt‘,‘2.txt‘) 7 ‘0.txt\\1.txt\\2.txt‘
- os.path.getatime(path)
返回path所指向的文件或者目录的最后存取时间 - os.path.getmtime(path)
返回path所指向的文件或者目录的最后修改时间这里的时间,可读性不好…1 >>> import os 2 >>> os.path.getatime(‘C:\\Users\\Beyondi‘) 3 1515454528.3171692 4 >>> os.path.getmtime(‘C:\\Users\\Beyondi‘) 5 1515454528.3171692
三.sys模块的常见用法
- sys.argv 命令行参数List,第一个元素是程序本身路径
- sys.exit(n) 退出程序,正常退出时exit(0)
- sys.version
获取Python解释程序的版本信息1 >>> import sys 2 >>> sys.version 3 ‘3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)]‘
- sys.path
返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值1 >>> import sys 2 >>> sys.path 3 [‘‘, ‘C:\\Program Files (x86)\\python3.6.1\\python36.zip‘, ‘C:\\Program Files (x 4 86)\\python3.6.1\\DLLs‘, ‘C:\\Program Files (x86)\\python3.6.1\\lib‘, ‘C:\\Progr 5 am Files (x86)\\python3.6.1‘, ‘C:\\Program Files (x86)\\python3.6.1\\lib\\site-p 6 ackages‘]
- sys.platform 返回操作系统平台名称,不太准确
- sys.stdout.write(‘please:‘)
控制台上行打印字符串和长度1 >>> import sys 2 >>> sys.stdout.write(‘please:‘) 3 please:7 4
- val = sys.stdin.readline()[:-1]
通过变量存储标准输入的字符串1 >>> import sys 2 >>> val = sys.stdin.readline()[:-1] 3 asdf 4 >>> print(val) 5 asdf
四.总结
总结来看,os和sys模块的功能有限,如果要实现文件和系统层面较为复杂的功能,还需要借助其他模块(如shutil)。