当前位置:

首页 > 编程开发 > Python常用标准库之os模块与shutil模块的使用方法

Python常用标准库之os模块与shutil模块的使用方法

系统模块importos系统模块用于对系统进行操作。常用方法os模块的常用方法有数十种之多,本文中只选出最常用的几种,其余的还有权限操作、文件的删除创建等详细资料可以参考官方文档。system--执行系统命令参数的数据类型是字符串格式,内容是系统指令。执行时,直接返回系统输出。importosos.system('ifconfig')#Linux系统shell命令os.system('ipconfig')#Windows系统dos命令popen--执行系统命令在使用syst

本文目录

    系统模块

    import os

    系统模块用于对系统进行操作。

    常用方法

    os模块的常用方法有数十种之多,本文中只选出最常用的几种,其余的还有权限操作、文件的删除创建等详细资料可以参考官方文档。

    system -- 执行系统命令

    参数的数据类型是字符串格式,内容是系统指令。执行时,直接返回系统输出。

    import os
    
    os.system('ifconfig')  # Linux系统shell命令
    os.system('ipconfig')  # Windows系统dos命令

    popen -- 执行系统命令

    在使用system执行系统命令的时候,发现在windows系统下执行命令时,中文字符发生了乱码!这是因为windows为减少占用,对中文系统使用GB格式编码,而python中默认使用的UTF-8编码,编码不兼容导致了乱码问题。

    popen也可以执行系统指令,但是和system的工作方式不一样。

    popen执行系统指令之后返回对象,通过内置方法read读出字符串,这个过程中read方法自动的将其它编码转换成为了UTF-8格式,所以popen相比system有更高的可读性和兼容性。

    而在实际的使用过程中,发现popen不存在阻塞,即在执行一些长时间系统任务的时候,不会等待系统任务结束,python代码就会继续执行,在某些场景下会导致问题的出现。比如在我的一个场景中,要将一个文件夹中的文件删除,之后在重写一份文件,使用popen导致文件还没有删除,而代码继续执行使新文件已经写好,而这个时候popen又将我新写的文件删除,导致我的程序在后续出现bug。所以,如果没有可读性的要求,我建议优先使用system方法。

    import os
    
    obj = os.popen('ipconfig')
    res = obj.read()
    print(res)

    listdir -- 获取指定文件夹中的所有文件

    获取指定文件夹中的所有文件(包括文件和文件夹),返回文件的名称,以列表的形式返回,默认情况为当前路径。

    import os
    
    # 默认为当前路径
    files = os.listdir()
    print(files)
    
    # 相对和绝对路径都可以使用
    files = os.listdir('C:')
    print(files)

    walk -- 递归遍历目录

    递归遍历指定目录,包括其所有的子目录,返回一个迭代器对象。迭代器每次返回一个元组,元组为三个元素:

    • 第一个元素为字符串,表示当前目录路径;

    • 第二个元素为列表,表示当前目录下的所有文件夹名(不包括子目录中的);

    • 第三个元素为列表,表示当前遍历目录中的所有文件名(不包括子目录中的);

    主要参数含义
    top指定目录;
    topdown正序遍历还是倒序遍历,默认为True(正序);

    请看下例,目录结构如下:

    Python常用标准库之os模块与shutil模块的使用方法

    import os
    
    path = r'C:\Users\MSR\Desktop\test'
    
    # 正序遍历
    res = os.walk(path)  # 返回迭代器
    for i in res:
        print(i)
    r"""
    ('C:\\Users\\MSR\\Desktop\\test', ['1', '2'], ['root.txt'])
    ('C:\\Users\\MSR\\Desktop\\test\\1', ['111'], ['1.txt'])
    ('C:\\Users\\MSR\\Desktop\\test\\1\\111', [], ['11.txt'])
    ('C:\\Users\\MSR\\Desktop\\test\\2', [], ['2.txt'])
    """
    
    # 倒序遍历(优先展示最深子目录)
    res = os.walk(path, topdown=False)
    for i in res:
        print(i)
    r"""
    ('C:\\Users\\MSR\\Desktop\\test\\1\\111', [], ['11.txt'])
    ('C:\\Users\\MSR\\Desktop\\test\\1', ['111'], ['1.txt'])
    ('C:\\Users\\MSR\\Desktop\\test\\2', [], ['2.txt'])
    ('C:\\Users\\MSR\\Desktop\\test', ['1', '2'], ['root.txt'])
    """

    getcwd -- 获取当前工作路径

    import os
    
    # 获取当前的工作路径
    dir_path = os.getcwd()
    print(dir_path)  # E:\0-project\python\test
    
    # 获取当前文件的路径
    file_path = __file__  # 使用内置属性__file__获取
    print(file_path)  # E:/0-project/python/test/test3.py

    注意:getcwd()获取的使用当前工作路径,__file__是获取当前文件的路径。

    对于这个注意事项,大家一定要铭记于心,因为我被人欺骗了,当然这应该算是pycharm的坑吧!

    注意了,文件的所在路径和工作路径是不相同的,文件的所在路径就是在系统中的这个脚本文件实实在在的地址,如果这个文件在C:\下,那么在任何的情况下这个文件的所在路径都是C:\;而工作路径不同,如果我们在C:\下执行这个python文件,那么我们的工作路径就是C:\,如果我们是在D:\下执行,那么我们的工作路径就是D:\,这就是文件所在地址和工作地址的区别,但是在一般情况下,我们执行文件都是在文件的所在地址执行的,所以大部分的时候文件所在路径和当前工作路径都是相同的。

    可我在最开始学习这个方法的时候,我的老师教我说getcwd()的作用是获取文件的所在路径,那么是什么让我一直以为getcwd()的作用是获取文件的所在路径呢?是老师教给我的……感觉这个老师很不靠谱?那么老师怎么没有发现其中的含义呢?我怎么又一直深信不疑呢?我觉得这个一定是要pycharm来背锅了!我们在学习的时候一般都是相信自己的实际操作的结果的,我们执行的结果是什么,反复那么几次,我们的印象就会加深!

    然后今天2021年12月7日20:58:09我在给公司的项目写一个启动脚本,目的是为了避免使用繁琐的命令去启动关闭项目,那么我在写的时候为了能够在系统的任何一个地方都是可以使用这个脚本,所以将命令中的各种路径全部写为绝对路径,我们系统工程师对绝对路径是非常熟练的!但是在我写好使用的时候就发现程序根本就启动不起来,已启动就死掉了,我就开始找原因,后来我发现在程序的目录下启动就没有问题,在其它的地址启动就有问题,我就意识到这是路径的错误。当然我们是有日志的,我看日志说是配置文件相关的地方出现了错误,我一看,就很好奇,配置文件是在程序的目录中的,读取的时候使用相对路径来获取,但是却没有读到文件,但是我检查之后文件是存在的!那么这个问题就很明显了,工作路径出了问题。

    但是我还疑惑,为什么会影响到相对路径吗?然后我就测试了getcwd,发现果然如此,getcwd返回的不是文件的所在地址而是当前所在的工作地址,这个时候我还不死心,因为当时老师说的不是这样,所以我以为是linux和windows的差异,所以我就咋爱windows中又测试了一遍,发现还是一样的。那么我就又疑惑了,怎么在pycharm中,工作路径始终都是文件的所在路径呢?然后我就发现原来pycharm中可以指定文件的工作路径,而且默认将当前的文件路径作为工作路径使用。

    Python常用标准库之os模块与shutil模块的使用方法

    然后我看文档介绍:Return a unicode string representing the current working directory.,emmm估计当时老师也是被pycharm坑了吧。所以大家以后如果想要在程序中固定工作路径,可以在启动文件中使用__file__获取,或者使用os.chdir方法。

    然后最后还是在强调一下:工作路径会影响到相对路径的使用,但是不会影响到sys.pathpython的环境变量。

    chdir -- 修改当前工作路径

    之前我们有学过很多的函数,他们在涉及到路径的时候,一般默认情况都是当前脚本文件所在的目录(比如刚才的listdir、getcwd),如果将文件的默认工作路径修改,就会影响到其它的一些功能,比如说我们导入文件使用相对路径等,所以,谨慎使用。

    import os
    
    # 在修改默认工作路径前使用
    print(os.getcwd())  # E:\0-project\python\test
    
    # chdir 修改当前文件工作的默认路径
    os.chdir('C:')
    
    # 在修改工作路径后使用
    print(os.getcwd())  # C:\

    access -- 测试权限

    用于测试一个指定路径或者文件的权限,返回True或者False。

    语法:os.access(path, mode)

    必要参数为path和mode,分别表示路径和测试的权限类型。

    mode说明
    os.F_OK是否存在;
    os.R_OK是否可读;
    os.W_OK是否可写;
    os.X_OK是否可执行;

    urandom -- 随机字节对象

    返回包含适合加密使用的随机字节的bytes对象。

    import os
    
    # 参数为字节长度
    key = os.urandom(1)
    print(key, len(key))
    # b'\x92' 1
    
    key = os.urandom(5)
    print(key, len(key))
    # b'\xde\x05/lh' 5

    getpid&getppid -- 获取进程和父进程

    getpid用于返回当前程序(脚本文件)的进程ID,getppid用于返回当前程序(脚本文件)的父进程ID。

    # 获取进程唯一ID(PID)
    import os
    
    # getpid 返回当前进程的ID
    print(os.getpid())  # 10784
    
    # getppid 返回父进程的ID
    # 如果父进程已退出,Windows计算机仍将运行返回其id;其他系统将返回“init”进程的id;
    print(os.getppid())  # 16468

    cpu_count -- 获取CPU核心数(逻辑)

    import os
    
    print(os.cpu_count())
    
    """
    结果:
    8
    """

    常用属性

    enciron -- 操作环境变量

    import os
    
    #  获取系统的所有环境变量
    ev_var = os.environ
    print(ev_var)
    
    # 获取系统指定的环境变量
    path_ev_var = os.environ['PATH']
    print(path_ev_var)
    
    # 添加环境变量
    os.environ['PATH'] += r':/home/msr'  # Linux使用冒号分隔
    os.environ['PATH'] += r';C:\Users\MSR'  # Windows使用分号分隔
    
    # 其实可以看到,环境变量其实就是一个特殊的字典,修改环境变量就是在操作一个字典数据而已

    name & sep & linesep

    import os
    
    # name 获取系统标识(Linux ->posix   windows -> nt)
    print(os.name)  # nt
    
    # sep 获取路径分隔符号
    print(os.sep)  # \
    
    # linesep 获取系统的换行符号
    print(repr(os.linesep))  # '\r\n'

    文件操作

    mknod & remove -- 新建&删除文件

    windows系统不支持此方法。

    import os
    
    os.mknod('test.txt')
    os.remove('test.txt')

    mkdir & rmdir -- 创建&删除文件夹

    import os
    
    os.mkdir('test_dir')
    os.rmdir('test_dir')

    rename -- 重命名文件或文件夹

    语法:rename(old_path, new_path)

    import os
    os.rename('test.txt', 'hahaha.txt')

    makedirs & removedirs -- 迭代创建&删除文件夹

    import os
    
    # 迭代创建文件夹
    os.makedirs('a/b/c/d/e')
    # 迭代删除文件夹(文件夹中存在文件,则该文件夹不删除)
    os.removedirs('a/b/c/d/e')

    路径模块

    import os.path

    路径模块也是系统模块中的一部分。

    basename -- 返回路径中的文件名部分

    import os.path
    
    # 该路径不一定真实存在
    file_path = r'..\学习笔记\day1笔记.py'
    file_name = os.path.basename(file_path)
    print(file_name)  # day1笔记.py

    dirname -- 返回路径中目录部分

    import os.path
    
    file_path = r'..\学习笔记\day1笔记.py'
    dir_path = os.path.dirname(file_path)
    print(dir_path)  # ..\学习笔记

    split -- 将目录和文件名拆分成两部分

    import os.path
    
    file_path = r'..\学习笔记\day1笔记.py'
    tuple_var = os.path.split(file_path)
    print(tuple_var)  # ('..\\学习笔记', 'day1笔记.py')
    print(type(tuple_var))  # 返回元组: 

    join -- 将多个路径组合在一起

    import os.path
    
    path2 = 'abc'
    path3 = '123'
    path4 = 'main.py'
    
    # 使用join组合
    path = os.path.join(path2, path3, path4)
    print(path)  # abc\123\main.py
    
    # 也可以使用 os.sep
    path = path2 + os.sep + path3 + os.sep + path4
    print(path)  # abc\123\main.py

    splitext -- 将文件名分为文件名和后缀名

    import os.path
    
    # 分开文件名
    file_name = 'main.py'
    res = os.path.splitext(file_name)
    print(res)  # ('main', '.py')
    print(type(res))  # 
    
    # 分来完整路径
    file_path = r'..\学习笔记\day1笔记.py'
    res = os.path.splitext(file_path)
    print(res)  # ('..\\学习笔记\\day1笔记', '.py')
    print(type(res))  # 
    
    # 也可以使用字符串内置方法 split 实现
    res = file_path.split('.')
    print(res)  # ['', '', '\\学习笔记\\day1笔记', 'py']
    print(type(res))  # 

    getsize -- 获取指定文件的大小

    import os.path
    
    # 获取指定文件的大小(单位:byte)
    file_size_byte = os.path.getsize('test.txt')

    getctime -- 获取文件的创建时间

    获取文件的创建时间,返回时间戳。(windows有明确的创建时间,linux只有最后一次的修改时间。)

    import os.path
    import time
    
    # 获取文件创建时间
    stamp_time = os.path.getctime('./test.py')
    print(stamp_time)  # 1613989768.3445127
    
    # 配合 时间模块使用 获取时间
    print(time.ctime(stamp_time))  # Mon Feb 22 18:29:28 2021

    getmtime -- 获取文件的最后一次修改时间

    import os.path
    import time
    
    # 获取文件最后一次修改时间
    stamp_time = os.path.getmtime('./test.py')
    print(stamp_time)  # 1614037683.1067748
    
    # 配合 时间模块使用 获取时间
    print(time.ctime(stamp_time))  # Tue Feb 23 07:48:03 2021

    getatime -- 获取文件最后一次访问时间

    import os.path
    import time
    
    # 获取文件最后一次访问时间
    stamp_time = os.path.getatime('./test.py')
    print(stamp_time)  # 1635590737.799415
    
    # 配合 时间模块使用 获取时间
    print(time.ctime(stamp_time))  # Sat Oct 30 18:45:37 2021

    isdir & isfile & islink -- 检查路径类型

    不检查路径是否真实存在。

    import os.path
    
    # 检查路径类型,返回布尔值:
        # 不是对应类型或没有相应文件 : False
        # 是对应类型:True
    
    # isdir 检查路径是否是文件夹
    res = os.path.isdir('test.txt')
    
    # isfile 检查路径是否是文件
    res = os.path.isfile('test.txt')
    
    # islink 检查路径是否是链接
    res = os.path.islink('test.txt')

    isabs -- 检查路径是否是绝对路径

    不检查路径是否真实存在

    import os.path
    
    # 检查windows路径
    path = r'E:\小黄片'
    res = os.path.isabs(path)
    print(res)  # True
    
    # windows系统检查Linux路径
    path = r'/root/home'
    res = os.path.isabs(path)
    print(res)  # True

    abspath -- 相对路径转成绝对路径

    先检查一个路径是否是相对路径,是则将其转成绝对路径,反之不变。

    转成绝对路径的规则是:以当前的工作路径为基准,根据相对路径中的相对级别,将对应级别的工作路径替换为原路径中的相对路径。

    不检查路径是否真实存在。

    import os.path
    
    # 绝对路径不改变
    path = r'E:\学习资料'
    new_path = os.path.abspath(path)
    print(new_path)  # E:\学习资料
    
    # 相对路径转成绝对路径
    path = r'..\学习资料'
    new_path = os.path.abspath(path)
    print(new_path)  # E:\0-project\python\学习资料
    
    # 根据级别自动转换
    path = r'..\..\学习资料'
    new_path = os.path.abspath(path)
    print(new_path)  # E:\0-project\学习资料
    
    # 如果相对的级别过多,就以根目录为准(不会报错)
    path = r'..\..\..\..\..\..\..\..\..\..\学习资料'
    new_path = os.path.abspath(path)
    print(new_path)  # E:\学习资料

    exists -- 检查路径是否真实存在

    检查路径是否真实存在,返回布尔值。

    import os.path
    
    # 检查指定路径是否存在
    path = r'E:\小黄片'
    res = os.path.exists(path)
    print(res)  # False

    文件复制移动模块(文件操作)

    import shutil

    用于对文件进行操作。

    获取文件信息,获取文件信息,见系统模块。

    copyfileobj -- 复制文件(内容)

    只复制文件的内容,通过文件IO操作,将一个文件的对象复制到另一个文件对象当中,因为需要在文件IO对象中操作,所以不推荐使用。

    语法:copyfileobj(fsrc, fdst, length=16*1024)

    copyfileobj(被复制文件对象,新文件对象,一次性读取字符数量。)

    import shutil
    
    with open('test.txt', 'r', encoding='UTF-8') as fp1 :
       with open('test2.txt', 'w', encoding='UTF-8') as fp2 :
          shutil.copyfileobj(fp1, fp2)

    copyfile -- 复制文件(内容)

    底层调用copyfileobj,使用方便快捷,所以推荐使用。

    语法:copyfile(被复制文件路径, 新文件路径)

    import shutil
    shutil.copyfile('test.txt', 'test2.txt')

    copymode -- 复制文件(权限)

    仅复制文件的权限,不复制文件的内容(被赋值权限的文件必须存在),语法和copyfile相同。

    import shutil
    shutil.copymode('test.txt', 'test.txt')

    copystat -- 复制文件(除了内容)

    复制文件的所有的状态信息,包括各种日期、权限……就是没有内容。

    import shutil
    shutil.copystat('test.txt', 'test.txt')

    copy & copy2 -- 复制文件

    import shutil
    
    # 复制文件内容和权限
    shutil.copy('test.txt', 'test.txt')
    # 完整复制整个文件(包括状态、权限、内容……)
    shutil.copy2('test.txt', 'test.txt')

    copytree -- 迭代复制文件夹中的所有

    import shutil
    shutil.copytree('../学习笔记', '../学习笔记备份')

    rmtree -- 迭代删除文件夹(即使文件夹中有文件)

    import shutil
    shutil.rmtree('..\小黄片')

    move -- 移动文件或文件夹

    import shutil
    shutil.move('D:\学习资料', 'C:\我的心血')
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    怎么在Python中调用C语言代码提升性能
    怎么在Python中调用C语言代码提升性能

    详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

    Python与C语言的性能差异及底层原理
    Python与C语言的性能差异及底层原理

    深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

    Python和C语言哪个更适合编程入门
    Python和C语言哪个更适合编程入门

    客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    langgraph python guide中文入门教程详解
    langgraph python guide中文入门教程详解

    本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

    Windows 安装 Python:从官方入口到虚拟环境的可复现实践
    Windows 安装 Python:从官方入口到虚拟环境的可复现实践

    面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。