os模块
【一】概要
【二】常见用法
- 文件和目录操作:
os.getcwd()
: 获取当前工作目录。
os.chdir(path)
: 切换当前工作目录。
os.listdir(path='.')
: 返回指定目录下的所有文件和目录的列表。
os.mkdir(path)
: 创建目录。
os.makedirs(path)
: 递归创建多层目录。
os.remove(path)
: 删除文件。
os.rmdir(path)
: 删除目录。
os.removedirs(path)
: 递归删除多层目录。
- 路径操作:
os.path.join(path, *paths)
: 将多个路径组合成一个路径。
os.path.abspath(path)
: 返回路径的绝对路径。
os.path.basename(path)
: 返回路径的基本名称。
os.path.dirname(path)
: 返回路径的目录名称。
os.path.exists(path)
: 判断路径是否存在。
os.path.isfile(path)
: 判断路径是否为文件。
os.path.isdir(path)
: 判断路径是否为目录。
- 系统环境变量:
os.environ
: 包含系统环境变量的字典。
os.environ.get('VAR_NAME')
: 获取指定环境变量的值。
- 执行系统命令:
os.system(command)
: 在子shell中执行系统命令。
- 文件和目录状态:
os.stat(path)
: 获取文件或目录的状态信息。
- 路径拆分:
os.path.split(path)
: 将路径拆分为目录和文件名。
- 路径拓展:
os.path.expanduser(path)
: 展开 ~
和 ~user
。
os.path.expandvars(path)
: 展开环境变量。
- 进程控制:
os.fork()
: 在 Unix 系统中创建子进程。
os.kill(pid, signal)
: 向进程发送信号。
【三】详解
【1】文件和目录操作:
os.getcwd()
: 获取当前工作目录。
| import os |
| res = os.getcwd() |
| print(res) |
| |
os.chdir(path)
: 切换当前工作目录。
| import os |
| |
| |
| res = os.getcwd() |
| print(res) |
| |
| os.chdir(r"D:\Files\Python\pythonProject1\test") |
| |
| |
| res = os.getcwd() |
| print(res) |

os.listdir(path='.')
: 返回指定目录下的所有文件和目录的列表。
| import os |
| |
| |
| print(os.listdir(os.getcwd())) |
| |
| |
| |
os.mkdir(path)
: 创建目录。
- 如果文件夹已经存在将会报错
[WinError 183] 当文件已存在时,无法创建该文件。: 'test_outer'
| import os |
| |
| os.mkdir(path='test_outer') |
| |
| |
| os.mkdir(path=r'D:\Files\Python\pythonProject1\test\test_inner') |
| |
| import os |
| |
| os.mkdir(path='test_outer.json') |

os.makedirs(path)
: 递归创建多层目录。
| import os |
| |
| |
| os.mkdir(r'D:\Files\Python\pythonProject1\test\test1') |
| |
| |
| |
| |
| os.makedirs(r'D:\Files\Python\pythonProject1\test\test1') |

os.remove(path)
: 删除文件。
| import os |
| |
| os.remove(r'D:\Files\Python\pythonProject1\test\test1\0021.py') |
| |
| |
| '''不能删除文件夹''' |
| os.remove(r'D:\Files\Python\pythonProject1\test\test1') |
| |
os.rmdir(path)
: 删除目录。
| import os |
| |
| os.rmdir(r'D:\Files\Python\pythonProject1\test\test1') |
| |
| |
| '''需要在文件夹下没有文件了,才可以删除,如果不为空,则会报错''' |
| |
os.removedirs(path)
: 递归删除多层目录。
| import os |
| |
| os.removedirs('test/test1') |
| |
| |
| '''同样需要在文件夹下没有文件了,才可以删除,如果不为空,则会报错''' |
| |
【2】路径操作:
os.path.join(path, *paths)
: 将多个路径组合成一个路径。
| import os |
| |
| |
| now_path = os.getcwd() |
| res = os.path.join(now_path, 'test.py') |
| print(res) |
| |
| '''可以只传递一个参数,但失去了拼接路径的功能了就''' |
| res = os.path.join('test.py') |
| print(res) |
| |
| |
| '''也可以拼接两个文件夹参数''' |
| res = os.path.join('1', 'test.py') |
| print(res) |
| |
os.path.abspath(path)
: 返回路径的绝对路径。
| import os |
| |
| res = os.path.join('1', 'test.py') |
| abs_path = os.path.abspath(res) |
| print(abs_path) |
| |
os.path.basename(path)
: 返回路径的基本名称。
| import os |
| |
| res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py') |
| base_name = os.path.basename(res) |
| print(base_name) |
| |
| |
| '''也可以是文件夹''' |
| import os |
| |
| res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder') |
| base_name = os.path.basename(res) |
| print(base_name) |
| |
os.path.dirname(path)
: 返回路径的目录名称。
| '''与basename刚好相反,返回的是最后一级目录之前的路径''' |
| import os |
| |
| res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder') |
| dir_name = os.path.dirname(res) |
| print(dir_name) |
| |
os.path.exists(path)
: 判断路径是否存在。
| '''判断路径是否存在''' |
| import os |
| |
| res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder') |
| is_exists = os.path.exists(res) |
| print(is_exists) |
| |
| |
| |
| os.mkdir(res) |
| is_exists = os.path.exists(res) |
| print(is_exists) |
| |
os.path.isfile(path)
: 判断路径是否为文件。
| import os |
| |
| res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder') |
| is_exists = os.path.isfile(res) |
| print(is_exists) |
| |
| |
| res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py') |
| is_exists = os.path.isfile(res) |
| print(is_exists) |
| |
os.path.isdir(path)
: 判断路径是否为目录。
| import os |
| |
| res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder') |
| is_exists = os.path.isdir(res) |
| print(is_exists) |
| |
| |
| res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py') |
| is_exists = os.path.isdir(res) |
| print(is_exists) |
| |
【3】文件信息
os.path.getatime(path)
: 获取文件或目录的最后访问时间
- Access Time (atime): 表示文件或目录最后一次被访问的时间。即文件内容最后一次被读取的时间。在某些系统上,读取文件内容时,文件的 atime 会被更新
| import os |
| import time |
| |
| res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py') |
| atime = os.path.getatime(res) |
| |
| print(atime) |
| |
| time_strf = time.strftime("%x %X", time.localtime(atime)) |
| print(time_strf) |
os.path.getctime(path)
: 获取文件或者目录的创建时间
- Change Time (ctime): 表示文件或目录的状态发生变化的时间。这包括文件的元数据(比如权限)的修改,或者文件内容的变化。在某些系统上,文件内容发生变化时,文件的 ctime 会被更新。
| import os |
| import time |
| |
| res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py') |
| ctime = os.path.getctime(res) |
| |
| print(ctime) |
| |
| time_strf = time.strftime("%x %X", time.localtime(ctime)) |
| print(time_strf) |
os.path.getmtime(path)
: 返回文件或路径的最后修改时间
- Modification Time (mtime): 表示文件内容最后一次被修改的时间。即文件的实际内容被修改的时间。在文件内容发生变化时,文件的 mtime 会被更新
| import os |
| import time |
| |
| res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py') |
| mtime = os.path.getmtime(res) |
| |
| print(mtime) |
| |
| time_strf = time.strftime("%x %X", time.localtime(mtime)) |
| print(time_strf) |
os.path.getsize(path)
: 返回文件的大小
| import os |
| |
| res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py') |
| file_size = os.path.getsize(res) |
| print(file_size) |
| |

os.stat(path)
: 获取文件夹/文件详细信息
| import os |
| |
| res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py') |
| file_stat = os.stat(res) |
| print(file_stat) |
| |
| |
- st_mode (文件的模式/权限): 包含文件的权限信息。可以使用
stat.S_ISDIR(mode)
、stat.S_ISREG(mode)
等函数来判断文件的类型。
- st_ino (inode 号): 包含文件的 inode 号,唯一标识文件在文件系统中的位置。
- st_dev (设备号): 包含文件所在设备的标识符。
- st_nlink (硬链接数): 包含文件的硬链接数。如果文件有多个硬链接,该数值大于 1。
- st_uid (用户 ID): 包含文件所有者的用户 ID。
- st_gid (组 ID): 包含文件所属组的组 ID。
- st_size (文件大小): 包含文件的大小,以字节为单位。
- st_atime (最后访问时间): 包含文件的最后访问时间。
- st_mtime (最后修改时间): 包含文件的最后修改时间。
- st_ctime (创建时间): 包含文件的创建时间。
【4】查看分隔符等
os.sep
: 用于表示操作系统路径中的路径分隔符的字符串
| import os |
| |
| print(os.sep) |
| |
| path = "D:" + os.sep + "files" + os.sep + "000.py" |
| print(path) |
os.linesep
:用于表示当前操作系统的换行符。
| import os |
| |
| print(os.linesep) |
| |
| path = "a" + os.linesep + "b" |
| print(path) |
| |
| |
- Windows 上是
\r\n
- Unix/Linux 上是
\n
os.pathsep
:用于分隔文件路径的字符串
| import os |
| |
| print(os.pathsep) |
- 在 Unix/Linux 系统上,它通常是
':'
(冒号)
- 在 Windows 系统上,它通常是
';'
(分号)

os.name
:表示当前操作系统的名称
'posix'
: 表示 Unix/Linux 系统。
'nt'
: 表示 Windows 系统。
'os2'
: 表示 OS/2 系统。
'ce'
: 表示 Windows CE 系统。
'java'
: 表示 Java 环境。
【5】执行系统命令
os.system(command)
: 运行shell命令
- command :"bash command" 由bash解释器执行的shell命令
| import os |
| |
| os.system("tasklist") |

os.popen(command).read()
: 运行shell命令,获取执行结果
| import os |
| |
| task_list = os.popen("tasklist").read() |
| print(task_list) |
| print(type(task_list)) |
- 可以通过变量接收值
os.system
只能执行,而os.popen().read()
可以接收值

【四】小练习
【0】__file__
:获取当前文件的绝对路径
【1】列举出指定文件夹下的所有文件
| import os |
| |
| |
| BASE_DIR = os.path.dirname(__file__) |
| |
| media_path = os.path.join(BASE_DIR, 'media') |
| |
| |
| file_list = os.listdir(media_path) |
| |
| media_menu = {} |
| for index, value in enumerate(file_list): |
| media_menu[index + 1] = value |
| |
| while True: |
| for k, v in media_menu.items(): |
| print(f"{k} | {v}") |
| choice = input("请输入查看的文件编号:").strip() |
| if choice.isdigit(): |
| choice = int(choice) |
| if choice not in media_menu.keys(): |
| print("编号不存在!") |
| continue |
| else: |
| mp4_path = os.path.join(media_path, media_menu[choice]) |
| with open(mp4_path, 'rb') as fp: |
| data = fp.read() |
| print(data) |
| else: |
| print("请输入编号!") |
| continue |
| |
| ''' |
| 1 | media1.mp4 |
| 2 | media2.mp4 |
| 3 | media3.mp4 |
| 请输入查看的文件编号:1 |
| b'' # 没有内容,所以此处为空 |
| ''' |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了