python之os模块详解
python中的os模块
前言
1、os是operation system(操作系统)的缩写;os模块就是python对操作系统操作接口的封装。os模块提供了多数操作系统的功能接口函数。(OS模块提供了与操作系统进行交互的函数)
2、操作系统属于Python的标准实用程序模块。该模块提供了使用依赖于操作系统的函数的便携式方法。
3、在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告(从而发送测试报告邮件),查找测试用例的Excel文件或者Yaml文件等。
os函数
1、当前路径及路径下的文件
os.getcwd() :查看当前所在路径。【具体到当前脚本的上一级】
os.listdir(path) :列举path目录下的所有文件。返回的是列表类型。
import os os.getcwd() # 'D:\\pythontest\\ostest' os.listdir(os.getcwd()) #['hello.py', 'test.txt']
2、绝对路径
os.path.abspath(path) :返回当前文件位置的绝对路径。
os.path.realpath(path) :返回当前文件位置的绝对路径。
注意:如果 os.path.abspath(.) 存在与已被定义的方法中,则返回的绝对路径是调用该方法的模块的绝对路径,而不是方法的绝对路径。
举例1:
import os print(os.getcwd()) print(os.path.abspath('.')) print(os.path.abspath('..')) print(os.path.abspath('../..'))
运行结果:
举例2:
import os print(os.getcwd())
print(os.path.realpath(__file__))
print(os.path.abspath(__file__))
运行结果:
3、查看指定文件路径的文件夹路径部分和文件名部分
os.path.split(path) :将指定文件的路径分解为(文件夹路径, 文件名),返回的数据类型是元组类型。
①若文件夹路径字符串最后一个字符是\,则只有文件夹路径部分有值;
②若路径字符串中均无\,则只有文件名部分有值。
③若路径字符串有\,且不在最后,则文件夹和文件名均有值。且返回的文件名的结果不包含\.
4、路径拼接
os.path.join(path1, path2, ...) :将入参的path进行组合,若其中有绝对路径,则之前的path将被删除。
os.path.split('D:\\pythontest\\ostest\\Hello.py') # ('D:\\pythontest\\ostest', 'Hello.py') os.path.split('.') # ('', '.') os.path.split('D:\\pythontest\\ostest\\') # ('D:\\pythontest\\ostest', '') os.path.split('D:\\pythontest\\ostest') # ('D:\\pythontest', 'ostest') os.path.join('D:\\pythontest', 'ostest') # 'D:\\pythontest\\ostest' os.path.join('D:\\pythontest\\ostest', 'hello.py') # 'D:\\pythontest\\ostest\\hello.py' os.path.join('D:\\pythontest\\b', 'D:\\pythontest\\a') # 'D:\\pythontest\\a'
5、获取路径的文件夹路径部分
os.path.dirname(path) :返回path中的文件夹路径部分,且路径结尾不包含'\'。【即返回文件的路径(此路径不包含文件名)】
os.path.dirname('D:\\pythontest\\ostest\\hello.py') # 'D:\\pythontest\\ostest' os.path.dirname('.') # '' os.path.dirname('D:\\pythontest\\ostest\\') # 'D:\\pythontest\\ostest' os.path.dirname('D:\\pythontest\\ostest') # 'D:\\pythontest'
6、获取路径的文件名
os.path.basename(path) :返回path中的文件名。
os.path.basename('D:\\pythontest\\ostest\\hello.py') # 'hello.py' os.path.basename('.') # '.' os.path.basename('D:\\pythontest\\ostest\\') # '' os.path.basename('D:\\pythontest\\ostest') # 'ostest'
7、查看文件时间
os.path.getmtime(path) :返回文件或文件夹的最后修改时间,从新纪元到访问时的秒数。
os.path.getatime(path) :返回文件或文件夹的最后访问时间,从新纪元到访问时的秒数。
os.path.getctime(path) :返回文件或文件夹的创建时间,从新纪元到访问时的秒数。
os.path.getmtime('D:\\pythontest\\ostest\\hello.py') # 1481695651.857048 os.path.getatime('D:\\pythontest\\ostest\\hello.py') # 1481687717.8506615 os.path.getctime('D:\\pythontest\\ostest\\hello.py') # 1481687717.8506615
8、查看文件大小
os.path.getsize(path) :返回文件的大小;若path入参值是一个文件夹路径则返回0。
os.path.getsize('D:\\pythontest\\ostest\\hello.py') # 58L os.path.getsize('D:\\pythontest\\ostest') # 0L
9、查看文件是否存在
os.path.exists(path) :判断文件或者文件夹是否存在,返回True 或 False。【文件或文件夹的名字不区分大小写】
os.listdir(os.getcwd()) # ['hello.py', 'test.txt'] os.path.exists('D:\\pythontest\\ostest\\hello.py') # True os.path.exists('D:\\pythontest\\ostest\\Hello.py') # True os.path.exists('D:\\pythontest\\ostest\\Hello1.py') # False
10、os模块中操作目录以及文件的函数
os.mkdir('文件夹名') :新建文件夹;入参为目录路径,不可为文件路径;(父目录必须存在的情况下创建下一级文件夹)
os.rmdir('文件夹名') :删除文件夹;入参为目录路径,不可为文件路径
os.remove('文件路径') :删除文件;入参为文件路径,不可为目录路径
os.makedirs('路径及文件') :递归新建文件夹;可以连续创建该文件夹的多级目录
os.path.isdir('路径') :判断入参路径是否为文件夹,返回值为布尔值;是文件夹返回True,不是文件夹返回False
os.path.isfile('路径') :判断入参路径是否为文件,返回值为布尔值;是文件返回True,不是文件返回False
11、os模块中遍历目录数
一个遍历目录数的函数,它以一种深度优先的策略(depth-first)访问指定的目录。
os.walk(top=path,topdown=True,oneerror=None)
- 参数 top 表示需要遍历的目录树的路径。
- 参数 topdown 默认为 True ,表示首先返回根目录树下的文件,然后,再遍历目录树的子目录。 当topdown 的值为 False 时,则表示先遍历目录树的子目录,返回子目录下的文件,最后返回根目录下的文件。
- 参数 oneerror 的默认值为 None ,表示忽略文件遍历时产生的错误;如果不为空,则提供一个自定义函数提示错误信息,后边遍历抛出异常。
os.walk() 函数的返回值是一个生成器(generator),每次遍历的对象都是返回的是一个三元组 (root,dirs,files):该元组有3个元素,这3个元素分别表示每次遍历的路径名,目录列表和文件列表。
- root 代表当前遍历的目录路径,string类型。
- dirs 代表root路径下的所有子目录名称;list类型,列表中的每个元素是string类型,代表子目录名称。
- files 代表root路径下的所有子文件名称;list类型,列表中的每个元素是string类型,代表子文件名称。
实例1:
当前目录结构如下:
代码1:
import os from os.path import join home_path = "/home"
for (root, dirs, files) in os.walk(home_path): print(root) print(dirs) print(files) print("=" * 50)
运行结果:
/home ['root', 'zhang', 'li'] ['test.txt', 'hai.mp4'] ================================================== /home/root [] ['1.txt', '2.txt', '3.txt'] ================================================== /hoome/zhang [] ['zhang_1.mp4', 'zhang_2.mp4', 'zhang_3.mp4'] ================================================== /home/li [] [] ==================================================
解析:
一共三行:
第1行代表当前遍历的目录,我们称为root目录,
第2行代表root目录下的子目录列表,我们称为dirs子目录列表,
第3行代表root目录下的子文件列表,我们称为files子文件列表,
注意:上面的列表为空就代表当前遍历的root目录下没有子目录或者没有子文件。
代码2:遍历home目录下获取所有的目录和文件的绝对路径
import os from os.path import join home_path = "/home"
for (root, dirs, files) in os.walk(home_path): for dir in dirs: print(join(root, dir)) for file in files: print(join(root, file))
运行结果:
/home /home/root /home/zhang /home/li /home/test.txt /home/hai.mp4 /home/root/1.txt /home/root/2.txt /home/root/3.txt /home/zhang/zhang_1.mp4 /home/zhang/zhang_2.mp4 /home/zhang/zhang_3.mp4
实例2:
import os
def walk(path): if not os.path.exists(path): return -1
for root,dirs,names in os.walk(path): for filename in names: print(os.path.join(root,filename)) # 路径和文件名连接构成完整路径
if __name__=='__main__': path = "C:\\Users\\Administrator\\Desktop\\2017-9-1" walk(path)
运行结果:
C:\Users\Administrator\Desktop\2017-9-1\2017-9-1.txt C:\Users\Administrator\Desktop\2017-9-1\2017-9-1storage.txt C:\Users\Administrator\Desktop\2017-9-1\apk.conf C:\Users\Administrator\Desktop\2017-9-1\数据采集导入质量统计_2017-09-01.docx C:\Users\Administrator\Desktop\2017-9-1\test1\2017-9-1.txt C:\Users\Administrator\Desktop\2017-9-1\test2\2017-9-1.txt
12、一些表现形式参数
os模块中还定义了一组文件、路径在不同操作系统中的表现形式参数。如下:
os.sep # '\\' os.extsep # '.' os.pathsep # ';' os.linesep # '\r\n'
13、获取在进程的控制终端上登录的用户的名称: os.getlogin() (即此时pc登录的用户名)
参数:不需要参数
返回类型:此方法返回一个字符串,该字符串表示在进程的控制终端上登录的用户的名称。
示例:
# Python program to explain os.getlogin() method # importing os module import os # Get the name of the user # logged in on the controlling # terminal of the process. user = os.getlogin() # Print the name of the user # logged in on the controlling # terminal of the process. print(user)
运行结果:
举例
在自动化测试过程中,常常需要发送邮件,将最新的测试报告文档发送给相关人员查看,所以就需要查找最新文件的功能。
举例:查找文件夹下最新的文件。
代码如下:
import os def new_file(test_dir): #列举test_dir目录下的所有文件(名),结果以列表形式返回。 lists=os.listdir(test_dir) #sort按key的关键字进行升序排序,lambda的入参fn为lists列表的元素,获取文件的最后修改时间,所以最终以文件时间从小到大排序 #最后对lists元素,按文件修改时间大小从小到大排序。 lists.sort(key=lambda fn:os.path.getmtime(test_dir+'\\'+fn)) #获取最新文件的绝对路径,列表中最后一个值,文件夹+文件名 file_path=os.path.join(test_dir,lists[-1]) return file_path #返回D:\pythontest\ostest下面最新的文件 print new_file('D:\\system files\\workspace\\selenium\\email126pro\\email126\\report')
运行结果:
总结
# python--函数 os.sep :主要用于系统路径中的分隔符 # Windows系统通过是“\\”,Linux类系统如Ubuntu的分隔符是“/”,而苹果Mac OS系统中是“:” # 常用的os模块命令: # 1、os.name——name顾名思义就是'名字',这里的名字是指操作系统的名字,主要作用是判断目前正在使用的平台,并给出操作系统的名字,如Windows 返回 'nt'; Linux 返回'posix'。注意该命令不带括号。 # 2、os.getcwd()——全称应该是'get current work directory',获取当前工作的目录 # 3、os.listdir(path)——列出path目录下所有的文件和目录名。Path参数可以省略。 # 4、os.remove(path)——删除path指定的文件,该参数不能省略。 # 5、os.rmdir(path)——删除path指定的目录,该参数不能省略。 # 6、os.mkdir(path)——创建path指定的目录,该参数不能省略。 # 7、os.unlink() 方法用于删除文件,如果文件是一个目录则返回一个错误 # os.remove() #删除文件 # os.rename() #重命名文件 # os.walk() #生成目录树下的所有文件名 # os.chdir() #改变目录 # os.mkdir/makedirs() #创建目录/多层目录 # os.rmdir/removedirs #删除目录/多层目录 # os.listdir() #列出指定目录的文件 # os.getcwd() #取得当前工作目录 # os.chmod() #改变目录权限 # os.path.basename() #去掉目录路径,返回文件名 # os.path.dirname() #去掉文件名,返回目录路径 # os.path.join() #将分离的各部分组合成一个路径名 # os.path.split() #返回(dirname(),basename())元组 # os.path.splitext() #返回filename,extension)元组 # os.path.getatime\ctime\mtime #分别返回最近访问、创建、修改时间 # os.path.getsize() #返回文件大小 # os.path.exists() #是否存在 # os.path.isabs() #是否为绝对路径 # os.path.isdir() #是否为目录 # os.path.isfile() #是否为文件 # os.system('command') 会执行括号中的命令,如果命令成功执行,这条语句返回0,否则返回1
拓展:os.listdir()与os.walk()两种方式获取文件路径与文件目录下所有子目录和文件的区别
实例1:在一个目录下面只有文件时可以使用 os.listdir() 函数
test_file文件夹中包含三个文件:
test_file:
test1.txt
test2.txt
test3.txt
获取该目录下的每个文件的绝对路径:
import os path = r'C:\Users\XXN\Desktop\test_file' for each_file in os.listdir(path): print(os.path.join(path,each_file))
运行结果:
C:\Users\XXN\Desktop\test_file\test1.txt
C:\Users\XXN\Desktop\test_file\test2.txt
C:\Users\XXN\Desktop\test_file\test3.txt
实例2:当一个目录下面既有文件又有目录(文件夹),可使用 os.walk() 函数读取里面所有文件
test_file中既包含文件也包含文件夹:
Test_file:
file1:
test1.txt
test2.txt
test3.txt
file2:
test1.txt
test2.txt
test3.txt
test1.txt
test2.txt
test3.txt
代码如下:
import os path = r'C:\Users\XXN\Desktop\test_file' for parent,dirnames,filenames in os.walk(path): print(parent,dirnames,filenames)
运行结果:
C:\Users\XXN\Desktop\test_file ['file1', 'file2'] ['test1.txt', 'test2.txt', 'test3.txt'] C:\Users\XXN\Desktop\test_file\file1 [] ['test1.txt', 'test2.txt', 'test3.txt'] C:\Users\XXN\Desktop\test_file\file2 [] ['test1.txt', 'test2.txt', 'test3.txt']
解析:
- parent:列出了目录路径下面所有存在的目录的名称
- dirnames:文件夹名
- filenames:列出了目录路径下面所有文件的名称
获得给定路径下所有的文件路径:
import os path = r'C:\Users\XXN\Desktop\test_file' for parent,dirnames,filenames in os.walk(path): for filename in filenames: print(os.path.join(parent,filename))
获取每个文件的绝对路径
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!