【python测试开发栈】—帮你总结Python os模块高频使用的方法

Python中的os模块是主要和系统操做相关的模块,在平时的工做中会常常用到,花时间整理了os模块的高频使用方法,同时整理出使用时须要注意的点。概括来说,os模块的方法能够分为:目录操做、文件操做、路径操做、系统操做等四大类,咱们接下来依次进行介绍。node

目录操做相关

建立、删除、重命名目录

# 当前目录下建立目录,注意第二个参数mode,在Windows被忽略
    os.mkdir("test_folder")
    # 删除目录,若是目录不为空,则抛出OSError:[Errno 66] Directory not empty
    os.rmdir("test_folder")
    # 遍历建立目录,能够建立多个目录,其中exist_ok为False,表示目录存在抛出异常。
    os.makedirs("a/b/c", exist_ok=False)
    # 遍历删除目录,能够直接,注意若是目录不为空,会抛出OSError:[Errno 66] Directory not empty
    os.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先遍历子目录)
             onerror 当walk遇到错误时会调用
        返回值:
            parent 指的是父目录,
            dir_name返回parent目录下全部的目录
            file_name返回parent目录下全部的文件
    '''
    list_result = os.walk("a", topdown=True, onerror=None, followlinks=False)
    for parent, dir_name, file_name in list_result:
        print(parent)
        print(dir_name)
        print(file_name)
        print("============")

    # 和listdir相似,都是对第一层目录遍历,区别在于scandir返回的是迭代器
    with os.scandir("a") as it:
        print("*"*12)
        for entry in it:
            print(entry.name)

须要注意的是,若是要遍历的目录下文件数量比较多,好比数百万个文件,那么就可使用os.scandir(),由于若是这时使用listdir()会形成内存紧张。python

获取目录

# 获取当前工做目录所在的绝对路径
    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(上次访问的时间)=1577449111, 
    st_mtime(最后一次修改的事件)=1577449111, st_ctime(建立时间)=1577449111)
    '''
    print(os.stat("."))

    # 一样,os也提供了单独获取某个属性的方法
    print(os.path.getatime("."))
    print(os.path.getctime("."))
    print(os.path.getmtime("."))
    print(os.path.getsize("."))

    # 修改文件的访问时间和修改时间
    os.utime(".", (1577449111, 1577449111))

在上面注释中提到的inode,主要用来存储文件的"元信息",好比文件的建立时间、文件的大小等,中文名叫做"索引节点"。linux

读写文件

# Python的os提供了open和write方法来读写文件
  # 打开文件
  fd = os.open("test3.txt", os.O_RDWR | os.O_CREAT)
  # 这里返回的是一个文件描述符
  print(fd)
  # 写入字符串
  os.write(fd, b"This is test")
  # 将字符串刷新到硬盘上
  os.sync()
  # 关闭文件
  os.close(fd)

  # 做为对比,Python提供了open方法能够更方便的操做文件,因此咱们通常直接使用open方法。
  with open("a/test3.txt", "wb") as f:
    # 这里返回的是一个操做文件的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 , d
    print(os.path.split(os.getcwd()))
    # 返回传入路径所在的目录,好比:传入a/b/c/d  返回:/a/b/c
    print(os.path.dirname(os.getcwd()))
    # 将传入path分割为路径和扩展,好比:传入a/b/c/d.txt  返回('a.b/c/d', '.text')
    print(os.path.splitext(os.path.abspath("./a/test3.txt")))

执行系统命令

# 注意这里执行的命令必定是在执行的操做系统存在的命令,好比在linux系统用ls,在windows系统用dir
    # 在当前进程中打开一个子shell(子进程)来执行命令
    # 返回值:命令的执行状态 0 执行成功、非0,表示执行不成功。 会将命令的执行结果写入到stdout中,也就是控制台。
    print(os.system("la"))

    print("================")
    '''
        参数:cmd:要执行的命令。
             mode:打开文件的模式,默认为'r',用法与open()相同。
             buffering:0意味着无缓冲;1意味着行缓冲;其它正值表示使用参数大小的缓冲。
             负的bufsize意味着使用系统的默认值,通常来讲,对于tty设备,它是行缓冲;对于其它文件,它是全缓冲。
        返回:这个方法会返回一个管道,返回一个链接管道的文件对象,好比为f,能够经过f.readlines()和f.read()来读取返回值。
    '''
    with os.popen("ls", "r", 1) as p:
        print(type(p))
        r = p.read()
        print(r)
    print("end")

不过Python提供了更强大的subprocess模块,使用subprocess.popen()方法会更加灵活。咱们后面会专门写文章来介绍subprocess这个模块的各类方法的使用。shell

系统操做

# 返回当前进程的id
    print(os.getpid())
    # 返回操做系统的信息
    print(os.uname())
    # 返回系统的环境变量
    print(os.environ)
    # 返回系统的环境变量,PATH对应的值
    print(os.environ.get('PATH'))

总结

上面总结了python3中os模块经常使用的方法,主要围绕对路径、目录及系统命令的操做,你们在平时使用过程当中能够灵活使用上面的各类方法,有时候须要多个方法搭配使用。我给你们留两个练习题,这是我以前写python脚本碰到的问题:编程

  • 获取某个目录下面最新的文件
  • 将全部以error.log结尾的文件,所有放到某个对应目录下。

你们能够思考下,而后在评论区写下你的答案。windows

关注【公众号:软件测试布道师】,回复【python】,便可获取【python自动化及编程实践资料】
相关文章
相关标签/搜索