Python中的os模块主要是和系统运行相关的。模块的高频使用方法,同时整理出使用时需要注意的点。总结一下,os模块的方法可以分为目录操作、文件操作、路径操作、系统操作四大类,我们将依次介绍。目录操作相关的目录创建、删除、重命名#在当前目录下创建一个目录,注意第二个参数mode,在Windows上是忽略的os.mkdir("test_folder")#删除一个目录,如果目录是不为空,会抛出OSError:[Errno66]Directorynotemptyos.rmdir("test_folder")#遍历创建目录,可以创建多个目录,其中exist_ok为False,表示目录存在,抛出异常.os.makedirs("a/b/c",exist_ok=False)#遍历并删除目录,直接可以,注意如果目录不为空,会抛出OSError:[Errno66]Directorynotemptyos.removedirs("a/b/c")#重命名文件或目录,路径不可更改os.rename("a","b")#升级版os.rename可以重命名文件或文件父目录.os.renames("b","a/b")遍历目录#遍历目录a下的文件,返回目录下的名字列表,注意不要遍历子目录file_name_list=os.listdir("a")print(file_name_list)'''功能:会递归遍历a目录下的文件和目录参数:topdown表示遍历目录的优先级(True先遍历根目录,False先遍历子目录)walk遇到错误会调用onerror返回值:parent指的是父目录,dir_name返回父目录下的所有目录file_name返回父目录下的所有文件'''list_result=os.walk("a",topdown=True,onerror=None,followlinks=False)forparent,dir_name,file_nameinlist_result:print(parent)print(dir_name)print(file_name)print("============")#和listdir类似,都是针对第一层目录遍历,不同的是scandir返回的是迭代器withos.scandir("a")asit:print("*"*12)forentryinit:print(entry.name)需要注意的是,如果要遍历如果里面有大量的文件目录,比如百万级的文件,那么可以使用os.scandir(),因为如果此时使用listdir(),会造成内存不足。getdirectory#获取当前工作目录所在的绝对路径print(os.getcwd())#返回..表示当前目录的上级目录print(os.pardir)#返回上级目录,这里使用os.path.abspath,获取绝对路径print(os.path.abspath(os.path.dirname(os.getcwd())))#用来改变当前工作目录os.chdir("a")print(os.getcwd())判断目录#判断路径a是否存在print(os.path.exists("a"))#判断路径a是否为目录print(os.path.isdir("a"))#判断路径a是否为文件print(os.path.isfile("a"))文件属性'''功能:返回文件/目录对应的属性返回值:st_mode(权限模式)=16877,st_ino(inode节点号)=12897368202,st_dev(inode设备号)=16777220,st_nlink(inode链接数)=5,st_uid(文件所有者id)=501,st_gid(文件所有者组id)=20,st_size(文件大小)=160,st_atime(las的时间taccess)=1577449111,st_mtime(最后修改事件)=1577449111,st_ctime(创建时间)=1577449111)'''print(os.stat("."))#同样os也提供了获取属性的方法分别打印(os.path.getatime("."))print(os.path.getctime("."))print(os.path.getmtime("."))print(os.path.getsize("."))#修改文件的访问时间和修改时间os.utime(".",(1577449111,1577449111))上面注释中提到的inode主要用来存放文件的“元信息”,比如作为文件的创建时间,文件大小等,中文名叫“索引节点”读写文件#Python的os提供了open和write方法读写文件#打开文件fd=os.open("test3.txt",os.O_RDWR|os.O_CREAT)#这里返回一个文件描述符print(fd)#写入字符串os.write(fd,b"Thisistest")#刷新字符串到硬盘os.sync()#关闭文件os.close(fd)#作为对比,Python提供了open方法更方便的操作文件,所以我们一般直接使用open方法。withopen("a/test3.txt","wb")asf:#这里返回的是一个操作文件的BufferedWriter对象print(f)f.write(b"aaaaaaaaa")路径操作#获取相对路径的路径print(os.path.abspath("."))#判断路径是否为相对路径print(os.path.isabs("."))#将路径拼接在一起print(os.path.join(os.getcwd(),"a","b"))#拆分传入路径的最后一级目录/文件,例如:传入a/b/c/d,返回:a/b/c,dprint(os.path.split(os.getcwd()))#返回传入路径所在目录,例如:传入a/b/c/dreturns:/a/b/cprint(os.path.dirname(os.getcwd()))#将传入的路径拆分为路径和扩展名,例如:传入a/b/c/d.txt并返回('a.b/c/d','.text')print(os.path.splitext(os.path.abspath("./a/test3.txt")))执行系统命令#注意这里执行的命令必须是正在运行的操作系统中存在的命令执行,比如在linux系统中使用ls,在Thewindows系统使用dir#在当前进程中打开一个子shell(subprocess)来执行命令#返回值:命令的执行状态为0,执行成功,非0,表示执行不成功。命令的执行结果会写入stdout,也就是控制台。print(os.system("la"))print("================")'''参数:cmd:要执行的命令。mode:打开文件的模式,默认为'r',用法同open()。缓冲:0表示无缓冲;1表示行缓冲;其他正值表示使用参数大小的缓冲。负的bufsize表示使用系统的默认值,一般来说,对于tty设备来说,是linebuffered;对于其他文件,它是完全缓冲的。返回:该方法会返回一个管道,并返回一个连接到管道的文件对象,比如f,返回值可以通过f.readlines()和f.read()读取。'''withos.popen("ls","r",1)asp:print(type(p))r=p.read()print(r)print("end")但是Python提供了更强大的subprocess模块,使用subprocess.popen()方法会更加灵活。后面我们会写一篇文章来介绍subprocess模块??的各种方法的使用。系统运行#返回当前进程的idprint(os.getpid())#返回操作系统的信息print(os.uname())#返回系统的环境变量print(os.environ)#返回系统的环境变量,PATH对应的值print(os.environ.get('PATH'))总结了python3中os模块的常用方法。主要围绕路径、目录和系统命令的操作。以上你可以在日常使用中灵活运用。方法多种多样,有时需要多种方法结合使用。留两道练习题给大家,是我之前写python脚本遇到的问题:获取某个目录下最新的文件,把所有以error.log结尾的文件都放到某个对应的目录下。大家可以想一想,然后在评论区写下你的答案。关注【公众号:软件测试布道师】,回复【python】,即可获得【python自动化与编程实践资料】
