玩转 Python 的“钥匙圈”——详解 os 模块的终极用法指南!

今天又又又来了,并带来了非常方便的os模块的用法指南,这个库可以说是非常的好用,来跟着我一起来一步步了解他到熟练的运用他吧!接下来我们来步入今天的主题--os模块!!!

如果你是初学者,那么你来对了,这篇专为初学者所写的教学文章就是为你准备!建议你从头到尾耐心看下去!如果你是大佬,那么也可以直接根据目录跳转!实战部分不要错过哦!

一、模块简介

在使用 Python 编写脚本时,我们经常会遇到这样的需求:

  • 自动批量创建或删除文件夹
  • 获取系统环境变量
  • 跨平台拼接路径
  • 执行系统命令如 ls 或 dir
  • 获取当前运行进程的信息
  • 等等

当你需要给一个文件夹中的 1000000 的文件进行有选择的命名或者移动时,手动是不是会非常麻烦呢?恰好,这些看似“操作系统级别”的任务,其实都可以通过今天我们要讲的 Python 自带的 os 模块轻松完成。

 os 模块是 Python 的标准库之一,提供了一个与操作系统交互的接口。无论你是在 Windows、Linux 还是 macOS 上运行 Python, os 模块都能以一致的方式帮你完成诸如路径处理、文件系统操作、环境变量管理、进程信息获取等操作。

它是所有自动化脚本、系统工具、服务端程序中几乎必用的模块之一。掌握 os ,就等于掌握了 Python 访问系统资源的钥匙。接下来,让我们进入他的功能展示部分,os 模块是 Python 的内置库,故我们直接导入即可。

import os

二、常用功能分类讲解(配合示例代码)

操作系统虽然复杂,但本质上也就是在文件夹和文件之间跑来跑去。os.path 就是 Python 给你配的“导航助手”,让你在文件世界里轻松穿梭,再也不用担心 Windows 和 Linux 那些让人头疼的路径分隔符!

:为了您的全身发展,在后面有速记小方法哦,可以顺带帮你复习以下英语单词!

2.1 路径操作( os.path 子模块)

我们现在进入第二部分的第一个板块:路径操作(os.path 子模块),这是一个经常会用到的板块,不论是深度学习,机器学习,以及日常生活中,都经常用到,本文会分几个标题来逐一讲解非常常用的几种 os.path 子模块,你可以根据目录来进行相应的跳转。

2.1.1 os.path.join(path, *paths) : 拼接路径

人生苦短,自己拼接路径那不更苦了吗?

 如果,你不会用 os 模块,那么你可能会写出下面代码

# 路径的直接相加拼接
full_path = "D:\\Users" + "\\" + "xiao_Z" + "\\" + "Documents"

这么写简直就是程序员的灾难啊!不仅不同操作系统的路径分隔符 (\ vs /) 能让人抓狂,而且应对同一目录下不同文件的拼接都需要很冗余的代码,简直是灾难!好在 os.path.join(path) 的出现,我们可以很方便的来拼接路径。函数的基本使用如下:

将后面的路径片段拼接到前面来
os.path.join(path, *paths)

 参数说明:

        path : 第一个路径片段(字符串)

        *paths : 后续任意多个路径片段,函数会自动用合适的分隔符连接它们

返回值:

        拼接后的完整路径(字符串) 

以下是一个简单的代码示例

import os

path = os.path.join("C:/Users", "xiao_Z", "Documents", "project")
print(path)  

# 不同操作系统会输出不同的\ or /,不用再苦恼于两者之间的不统一了
# Windows: C:\Users\xiao_Z\Documents\project
# Linux:C:/Users/xiao_Z/Documents/project

 这样来操作,无论你在哪个系统, os.path.join() 都能保证你拼的路径是对的!这就很了!

2.1.2 os.path.basename(path) or os.path.dirname(path) : 拆分文件路径

路径也是有头有尾的!

如果你不知道这个板块,那你在找某个文件所在目录的时候,是不是还在右键复制,分别复制文件名和文件所在目录的路径,这样效率简直是太低啦!而当你学会之后,一行代码轻松拿下,轻轻松松!函数的基本使用如下

# 用来取出最后一段路径(通常是文件名)
os.path.basename(path)
# 返回路径中除去文件名的部分(也就是“目录”)
os.path.dirname(path)

参数说明:

path : 完整路径字符串

返回值:

        basename()最后的文件名(不含目录)

        dirname()上级目录路径(不含文件名)

 以下是一个简单的代码示例

import os

full_path = "/home/xiao_Z/documents/report.pdf"
# 输出文件名
print("文件名:", os.path.basename(full_path))  # report.pdf
# 输出文件所在目录路径
print("所在目录:", os.path.dirname(full_path))  # /home/xiao_Z/documents

这样我们就可以很轻松并且很高级的来获取文件名和文件所在目录的路径了! 

2.1.3 os.path.exists(path) : 判断路径是否存在

不检查文件是否存在,就操作它?你是要造反!

正常使用电脑办公也知道,你把一个软件删了,只留有一个快捷方式在那,双击它是会报错的,正式因为快捷方式所链接的地址找不到相应的内容。

在开发中也是一样的,在试图读取、修改或删除一个文件之前,我们最好确认一下它真的在那儿。就像找对象前先确认对方是活人,os.path.exists(path)能避免你的代码扑空,避免你执行一些危险操作,在确认文件是否存在上,它发挥着至关重要的作用。函数的基本使用如下

# 判断路径是否存在,返回bool类型
os.path.exists(path)

参数说明:

        path : 要检测的路径(可以是文件或目录)

返回值: 

        True : 路径存在

        False : 路径不存在

以下是一个简单的代码示例

import os

file_path = "report.txt"
if os.path.exists(file_path):
    print("找到了文件!开始读取数据……")
else:
    print("文件压根不存在,别闹了。")

 在实际的开发中,难免会遇到需要读取某些路径下的某些文件,有时候人工的一点点确认是十分复杂的,但是你在代码中使用 os.path.exists(path) 可以实时的检测路径是否存在,继而进行下一步的操作,大大提高代码的鲁棒性!

2.1.4 os.path.isfile(path) 与 os.path.isdir(path) : 判断是文件还是目录

当你站在某个路径前,你是文件?还是目录?别急,我来验个明儿。

在日常代码中,我们经常需要判断某个路径到底是指向一个普通文件,还是一个文件夹(目录)。有时候你以为它是个文件,其实它是个文件夹装文件的“罐子”;有时候你以为它是个目录,其实它只是个 .txt 。

这时候,Python 中的 os.path.isfile() 和 os.path.isdir() 就像一对职业“真假路径鉴定师”,出马三秒钟,还你一份真相。 os.path.isfile() 的基本使用如下

os.path.isfile(path)

参数说明:

        path : 字符串类型,文件或目录的路径(可以是绝对路径或相对路径)

返回值:

        如果路径存在且是一个普通文件,返回 True

        如果路径不存在,或者存在但不是文件(比如是目录),返回 False

以下是  os.path.isfile() 的代码示例

import os

print(os.path.isfile("report.pdf"))   # 如果是一个文件,输出 True
print(os.path.isfile("data/"))        # 如果是个文件夹,输出 False

 os.path.isdir() 的使用同理,只是当目标为目录的时候为 True ,文件的时候为 False ,刚好相反,它的基本使用如下

os.path.isdir(path)

参数说明:

        path : 字符串类型,要检查的路径

返回值: 

        如果路径存在且是一个目录,返回 True

        如果路径不存在,或者存在但不是目录(比如是文件),返回 False

 如果不确定一个路径是文件还是文件夹,在开发中就可以用这个轻松实现,增强代码鲁棒性。

2.1.5 os.path.split(path) : 分清文件和目录

有时候你就是想一次性拆分出文件名和路径,那就来点狠的!

有时候我想要同时获取一个文件的文件名和该文件的目录名,用 os.path.dirname(path) 和 os.path.basename(path) 可以实现,但是要两行代码,我觉得有点麻烦,那我该怎么获得呢?复制绝对路径,然后分别删去路径和文件名来获得吗?感觉有点low诶。

那么 os.path.split(path) 能完全解决你的困惑,它是 basename() 和 dirname(path) 的组合拳,能够用一行代码解决这个需求!函数的基本使用如下

# 划清目录和文件
os.path.split(path)

参数说明:

        path : 路径字符串

返回值:

        一个二元组 (dirname, basename)

        ( dirname 是目录名,basename 是文件名)

以下是一个简单的代码示例

import os

path = "/usr/local/bin/python3/xiao_Z.txt"
# 分割
head_tail = os.path.split(path)

print("目录部分:", head_tail[0]) # 输出为 /usr/local/bin/python3
print("文件部分:", head_tail[1]) # 输出为 xiao_Z.txt

 这样我们就能轻松的获得目录部分和文件部分。

2.1.6 os.path.splitext(path) : 划分主文件名和扩展名

不想要 .txt,只要文件名本体?”这就是你的工具!

 os.path.splitext(path) 它能够把文件名和扩展名干净的分割开来,比如把 "xiao_Z.txt" 划分为 "xiao_Z" 和 ".txt",在只需要扩展名或者文件名的时候非常有效,下面是函数的基本使用

# 划分文件名
os.path.splitext(path)

参数说明:

        path : 文件路径或文件名

返回值:

        一个二元组 (主文件名, 扩展名)

以下是一个简单的代码示例

import os

filename = "data.csv"
name, ext = os.path.splitext(filename)
print("文件名:", name) # data
print("扩展名:", ext) # .csv

 这样我们就能轻松获得一个文件名的主文件名和扩展名。当然,还有一种方法也可以很方便的获取,代码如下

text = "xiao_Z.txt"
# 获得一个由主文件名和扩展名组成的数组
text_list = text.split(".") # ["xiao_Z", "txt"]

采用这种方法也可以轻松获得,但是前者获得的可读性会更强! 

2.1.7 os.path.abspath(path) : 获取绝对路径

人不能一辈子活在相对路径中。

在编程世界里,“相对路径”是个相对概念,比如 ../xiao_Z.txt 到底在哪儿,得看你当前在哪个文件夹。而“绝对路径”是客观的、无条件的,能告诉你文件在系统中具体的地理位置。

这时候,os.path.abspath(path) 就像地图导航,它能把模糊的相对路径翻译成清清楚楚的绝对路径。下面是函数的基本使用

# 获取绝对路径
os.path.abspath(path)

参数说明:

        path : 字符串类型,可以是相对路径,也可以是已经是绝对路径

返回值:

        该路径对应的绝对路径字符串

注意!!!: 它不会判断路径是否真实存在,只是“逻辑上”给你转换成绝对路径!

 以下是一个简单的代码示例

import os

relative = "./data/report.csv"
absolute = os.path.abspath(relative)

print("相对路径:", relative)
print("绝对路径:", absolute)

 这样就可以很轻松的获得绝对路径。

2.1.8 其他的 os.path 子模块

这里列举出其他的一些常用的子模块,相信经过上面的学习之后,这些子模块,你会用的得心应手的!下面列举出其参数类型,以及模块用法!

函数名功能描述返回类型常见用途/说明
os.path.normpath(path)规范化路径(如 a/../bbstr清理路径中冗余部分,返回逻辑上的标准路径
os.path.relpath(path, start)计算从 startpath 的相对路径str适合生成相对引用路径,默认从当前目录
os.path.isabs(path)判断路径是否为绝对路径bool常用于判断用户输入路径的类型
os.path.getsize(path)获取文件大小(以字节为单位)int查看文件占用空间
os.path.getmtime(path)获取文件最后修改时间戳(Unix时间)float可配合 time.ctime() 转换为可读时间
os.path.getatime(path)获取文件最后访问时间戳floatgetmtime() 类似
os.path.getctime(path)获取文件创建时间(Windows)或 metadata 改变时间(Unix)float平台行为不同,注意使用场景
os.path.samefile(path1, path2)判断两个路径是否指向同一文件bool比较硬链接或路径引用是否一致(需文件存在)

2.2 文件与目录操作

路径是地图,文件是战场,os 就是那个无所不能的战场指挥官。

现在我们进入第二个部分的第二个板块,这方面在可以让你很方便的来调用操作系统来帮助你做一些事情,下面我们一一讲解。

2.2.1 os.mkdir(path) : 创建一个目录

Python:来,我给你开个新房间。但一次只开一间。

 该模块的作用是用来创建一个空目录,可以直接指定目录的权限哦(Unix下常用),以下是函数的基本使用

os.mkdir(path, mode=0o777) # windows 一般只需要path

参数说明:

        path : 要创建的目录路径。只能创建单层目录,如果父目录不存在,它不会自动帮你造。

        mode : (可选)权限设置,默认是 0o777 八进制权限,类 Unix 系统下有效)。Windows 下基本无视它。

返回值: 

        无返回值。目录创建成功就成功,失败抛异常。

以下是一个简单的代码示例

import os

# 创建一个新文件夹
os.mkdir("my_folder_xiao_Z")

 如果路径正确,则会创建 my_folder_xiao_Z 的目录,否则则会抛出异常。

2.2.2 os.mkdirs(path) : 创建“祖孙三代”的多级目录

mkdir: 我只建一间。makedirs:你要几代同堂?我全给你建!

 该模块经常用来一次性构建多层路径,来一键完成深层次的 os.mkdir(path) 的多次调用,函数的基本使用如下

# windows下一般只需要name和exist_ok
os.makedirs(name, mode=0o777, exist_ok=False)

参数说明:

        name : 要创建的目录路径(支持多级)

        mode : 权限设置,默认 0o777

        exist_ok :  默认为 False 。若设为 True,即使目录存在也不会报错

返回值:

        无返回值,有时可能因为 exist_ok 的取值而因为目录存在而抛出异常

以下是一个简单的代码示例

import os

# 创建多层目录
os.makedirs("grandpa/parent/child", exist_ok=True)

这样我们就能很轻松的一次性构建多层路径。

2.2.3 os.remove(path) : 删除一个文件

Python:这是个文件?我来帮你物理消灭。

还在右键点击删除吗?这个模块来帮助你不留痕迹的直接删除一个文件,函数的基本使用如下

os.remove(path)

 参数说明:

        path : 要删除的文件路径。注意只能删除文件,不能删目录!

 返回值:

        无返回值,但是如果路径是目录,会抛出IsADirectoryError 。请搭配 os.rmdir() 使用

以下是一个简单的代码示例

import os

# 删除文件
os.remove("my_folder/old_file.txt")

 使用这个很方便,但请一定要注意,这个只能删除文件,如果用来删除目录会抛出异常!!可以配合前面所学习的 os.path.isfile() 来判断当前路径是否是一个文件,以此来增强代码鲁棒性,接下来,我们来学习删除目录的操作。

2.2.4 os.rmdir(path) : 删除一个空目录

不扫干净,不能撤退!这个目录里必须什么都没有。

本模块用来删除一个空目录。同样的,用来删除不是空目录的或者不是目录的文件是会抛出异常的 ,下面是该函数的基本使用

os.rmdir(path)

参数说明:

        path : 目标目录路径。只能删除空目录

返回值: 

        无返回值,如果删除非空目录会抛出异常

以下是一个简单的代码示例

import os
# 删除empty_dir的空目录
os.rmdir("my_folder/empty_dir")

如果目录中有任何内容,就会抛出 OSError !记住不要用这个删除非空目录的,可以用之前学习的 os.path.isdir() 来判断是否是一个目录,通过 os.listdir() (这个在后面会讲到)来确定是否是空目录来增强代码的鲁棒性!

2.2.5 os.removedirs(path) : 连锁删除空目录

这就像玩骨牌:只要是空的,我就一路清除。

从最深层往上只要都是空的就一路删除,但是只要所给路径上有一层不是空的就会抛出 OsError异常,函数的基本使用如下

os.removedirs(name)

参数说明:

        name : 目录路径,从最深层往上,如果每层都为空,就一路删除上去。

返回值: 

        无返回值,如果有一层不为空,则会抛出 OsError异常

以下是一个简单的代码示例

import os

# 删除 grandpa/parent/child,只要每一层都是空的
os.removedirs("grandpa/parent/child")

只要每一层都空,则可以删除该路径上的所有目录! 

2.2.6 os.rename(src, dst) : 文件 or 目录改名/搬家一把抓

你可以换个名字,也可以搬去新家,Python全帮你搞定。

 改名字还在用右键重命名吗?已经 out 了,现在我们来用代码将文件或者文件夹重命名,函数的基本使用如下

os.rename(src, dst)

参数说明:

        src : 原路径,可以是文件或目录

        dst : 目标路径。可以是改名,也可以是移动

返回值:

         无返回值,注意路径是正确性

以下是一个简单的代码示例

import os

# 文件改名
os.rename("old.txt", "xiao_Z.txt") # old.txt 更改为xiao_Z.txt

# 目录移动
os.rename("my_folder", "backup/my_folder") # my_folder目录移动到backup下

 注意,如果 dst 已经存在,会覆盖(一定要小心),不支持跨分区移动(Windows)

2.2.7 os.listdir(path = ".") : 看看这个目录里都住了谁?

像打开抽屉一样,看看都塞了啥进去。

 查看某一个目录下的全部文件以及文件夹,函数的基本使用如下

os.listdir(path='.')

参数说明:

        path : 要列出的目录路径,默认是当前目录 "."

返回值:

        返回该目录下的所有文件名以及目录名(不含路径),是一个列表

下面是一个简单示例

import os

# 获得当前目录下的有文件
files = os.listdir(".")
print(files) # ['xiao_Z.txt', 'xiao_Z']

这样我们就能轻松得到一个目录下的所有文件名以及目录名,也可以在前面 2.2.4 节中那样使用。

2.2.8 其他常用函数

出去上述以外,还有许多 os 模块的文件与目录操作,这里便不再赘述,做了一个速查表,有兴趣的可以详细了解一下,如下

函数名功能简述参数说明返回值备注
os.getcwd()获取当前工作目录当前路径的字符串返回的是绝对路径
os.chdir(path)更改当前工作目录path: 目标路径类似 shell 的 cd 命令
os.stat(path)获取文件/目录的状态信息path: 目标路径os.stat_result 对象可获取大小、修改时间等元信息
os.scandir(path='.')高效列出目录信息(可迭代)path: 要扫描的目录ScandirIterator 对象os.listdir() 更强,可判断是文件或目录
os.fspath(path)获取路径字符串表示形式任意实现了 __fspath__ 的对象或字符串字符串路径常用于兼容 pathlib 等对象
os.path.getsize(path)获取文件大小(单位:字节)path: 文件路径整数(字节数)仅对文件有效
os.path.getmtime(path)获取文件的最后修改时间(时间戳)path: 文件路径float 时间戳可配合 time.ctime() 查看格式化时间
os.path.exists(path)判断路径是否存在path: 文件或目录路径True / False文件或目录都可检测
os.path.samefile(path1, path2)判断两个路径是否引用同一文件两个路径字符串True / False适用于硬链接判断

2.3 系统与环境交互

2.3.1 os.name : 所在系统信息

Python偷偷告诉你,它在哪儿运行

 你有没有好奇过 Python 是在 Windows 上跑的,还是 Linux 上跑的?你可以之间问他,下面是基本用法示例

import os

print(os.name)  # 输出:'nt'(Windows)或 'posix'(Linux/macOS)

说明:

        os.name 并不是一个函数,而是一个字符串

常见值:

        posix : Unix/Linux/macOS

        nt : Windows

这样我们就能轻松知道目前是在什么系统上跑的! 

2.3.2 os.system(system) : 运行终端命令

让 Python 帮你敲命令行

这就像让 Python 替你打开终端敲一条命令,非常有用也非常危险(别让用户自己填参数!) 下面是基本用法示例

import os

os.system("echo Hello from the shell!")  # Windows / Linux 通用
os.system("dir") # Windows / Linux 通用

参数说明:

        command : 字符串形式的命令,例如 "dir","ls" ,"ping www.baidu.com"

返回值:

        命令的退出状态码(0表示成功)

但是用这个命令需要注意的一点是,这个命令执行的是系统层级的 Shell,千万别用于用户输入的命令拼接,防止命令注入! 

2.3.3 os.environ : 获得系统环境变量

Python 眼中的“系统变量字典”

如果你想获取或设置系统的环境变量,还需要一点点去设置中一点点找到系统的环境变量吗,os.environ就是你通往「环境变量」的大门。 以下是代码示例

import os

# 读取已有环境变量
print(os.environ.get("PATH"))

# 设置一个新的环境变量(仅在当前 Python 进程中有效)(这在临时开发中是非常实用的)
os.environ["MY_VAR"] = "HelloOS"
print(os.environ["MY_VAR"])

注意事项:

        os.environ 的类型是一个字典(字典状对象),支持.get() 索引、修改等操作

        只能影响当前 Python 进程及其子进程,退出 Python 后变量就消失了 

在实际的开发中,一个临时的环境变量有时候是非常有意义的。 

2.3.4 os.getlogin()、os.getpid() 等常用系统信息函数

这里过多内容不再赘述,做了一个速查表如下

函数名功能简述参数返回值备注
os.getlogin()获取当前登录用户名当前用户名称在某些 IDE 中可能报错,建议用 getpass.getuser() 替代
os.getpid()获取当前 Python 进程 ID整数常用于调试或多进程编程
os.cpu_count()获取 CPU 核心数核心数(int 或 None)返回值可能为 None(不可用时)
os.urandom(n)生成 n 字节的随机字节串n: 字节数bytes 类型常用于加密、令牌生成等安全场景
os.getenv(key, default=None)获取指定环境变量的值key: 变量名,default: 默认值环境变量值或默认值更安全的 os.environ.get() 替代品

2.4 进阶功能

这部分内容就像是Python 的黑科技仓库,涵盖了进程管理、文件描述符、底层路径操作等功能。如果说前面的函数是日常工具箱,那这些就是“系统管理员的秘密武器”。在这里,由于篇幅量过大,不再过多赘述,只举其中的几个例子和速查表在此,供读者阅读,如果感兴趣,可以根据速查表去查阅相关资料!

函数功能简述参数返回值适用说明
os.fork()在 Unix 上创建子进程父进程中返回子进程 PID,子进程中返回 0仅限 Unix/Linux 系统,Windows 不支持
os.execv(path, args)用新的程序替换当前进程path: 程序路径,args: 参数列表(包含程序名)无返回(成功则替换当前进程)常用于重启程序
os._exit(status)强制退出当前进程status: 退出状态码(int)sys.exit() 不同,不会调用清理函数
os.dup(fd) / os.dup2(fd, fd2)复制文件描述符fd, fd2: 整数文件描述符新的文件描述符常用于重定向
os.pipe()创建一个管道返回一对文件描述符 (r, w)用于进程间通信
os.read(fd, n)从文件描述符读取字节fd: 文件描述符,n: 字节数读取的字节数据(bytes)要搭配 os.open() 使用
os.write(fd, b)向文件描述符写入字节fd: 文件描述符,b: 字节数据写入的字节数os.read() 成对出现
os.open(path, flags, mode=0o777)低级方式打开文件flags: 打开模式,如 os.O_RDONLY返回文件描述符os.read/write 配合使用
os.close(fd)关闭文件描述符fd: 文件描述符不等同于 file.close(),这是低级操作
os.setuid(uid) / os.setgid(gid)设置用户或组 IDuidgid: 整数 ID需要管理员权限
os.chmod(path, mode)修改文件权限path: 文件路径,mode: 权限,如 0o755类似 Linux 的 chmod 命令
os.chown(path, uid, gid)修改文件所有者uid, gid: 用户和组 ID仅在类 Unix 系统有效

下面举一个小示例,用管道让两个 Python 程序“悄悄通信” !代码如下

import os

r, w = os.pipe()

pid = os.fork()

if pid > 0:
    # 父进程:写数据
    os.write(w, b"Hello from parent")
else:
    # 子进程:读数据
    message = os.read(r, 1024)
    print("Child received:", message.decode())

三、实战小案例

到现在,你还在看,实在是太棒啦!好了,目前已经了解了这么多 os 模块的技能,是时候上战场实战一下了!下面我将带来两个典型的小案例,分别聚焦在文件操作自动化系统信息提取两个方向,每一行代码都附带详细注释,并且会在后面总结所用到的 os 知识点, 帮助你真正掌握而不是“眼熟”。让你真正的会用并且理解记牢它!

光看不做是不行的!!!一定要自己下去实践!!!!!!!!!!!!!!!!!!

3.1 案例一:批量整理文件夹中的文件(按扩展名分类)

目标:将一个杂乱的文件夹中的文件,按照扩展名(如 .jpg, .pdf)归类到不同的子文件夹中。比如所有 .txt 文件放到 txt_files 文件夹中,.jpg 的放到 jpg_files 中。代码如下

import os

# 你要整理的目标目录
target_dir = "my_downloads"

# 遍历目标目录下的所有文件
for filename in os.listdir(target_dir):
    full_path = os.path.join(target_dir, filename)

    # 忽略目录,只处理文件
    if os.path.isfile(full_path):
        # 拿到扩展名(如 .jpg)并去掉点号
        _, ext = os.path.splitext(filename)
        ext = ext.lstrip('.').lower()  # 统一为小写,去掉点号

        if not ext:  # 如果没有扩展名,跳过
            continue

        # 构造子目录路径,比如 "my_downloads/jpg"
        subfolder = os.path.join(target_dir, f"{ext}_files")

        # 如果子目录不存在就创建
        if not os.path.exists(subfolder):
            os.mkdir(subfolder)

        # 构造移动后的目标路径
        new_path = os.path.join(subfolder, filename)

        # 移动文件
        os.rename(full_path, new_path)

        print(f"📁 Moved: {filename} → {subfolder}/")

 所涉及到的 os 函数解释

函数用途
os.listdir()获取文件夹下所有文件/目录的名字列表
os.path.join()拼接路径,避免操作系统差异
os.path.isfile()判断是否是普通文件
os.path.splitext()拆分文件名与扩展名
os.path.exists()检查目录是否存在
os.mkdir()创建新目录
os.rename()重命名或移动文件

 一定要去动手实践!!!!!!!!!!!!!!

3.2 案例二:自动打印当前系统环境信息报告

目标:获取当前运行环境的各种信息,如平台、用户名、路径、进程 ID、当前目录等,并生成一个简单的系统报告文本文件。代码如下

import os
import platform

report = []

# 获取平台信息(Windows/Linux/macOS)
report.append(f"操作系统平台: {platform.system()} {platform.release()}")

# 获取当前用户
report.append(f"当前用户名: {os.getlogin()}")

# 获取当前工作目录
report.append(f"当前工作目录: {os.getcwd()}")

# 获取进程 ID
report.append(f"当前进程 PID: {os.getpid()}")

# 获取环境变量中的 PATH 变量
report.append(f"PATH 环境变量:\n{os.environ.get('PATH', '')}")

# 拼接为多行字符串
report_text = '\n'.join(report)

# 写入到文本文件中
with open("system_report.txt", "w", encoding='utf-8') as f:
    f.write(report_text)

print("✅ 系统报告已生成:system_report.txt")

 所涉及到的 os 函数解释

函数用途
os.getlogin()获取当前登录的用户名
os.getcwd()获取当前工作目录
os.getpid()获取当前进程的 ID
os.environ.get()获取环境变量
open(..., "w")写入文件(标准库,不是 os 的)

还是那句话,最重要的一定是自己理解后去完整的实践,实践出真知,不要偷懒!!!! 

四、注意事项与最佳实践

虽然 os 模块功能强大,是 Python 与操作系统打交道的桥梁,但使用时也有不少“坑”要避开,否则轻则脚本崩溃,重则删库跑路!这一部分我们来总结一些实用的注意事项和最佳实践,帮助你写出更安全、健壮、跨平台的 os 脚本。

在这里,我总结了一些常用的需要注意的点,如下

#建议
1永远不要直接删除,先判断再操作
2路径拼接用 os.path.join()
3平台相关操作用 platform.system() 判断
4写操作务必加 try-except 防炸
5少用硬编码,尽量动态路径
6多打日志,调试利器
7脚本最后要清场,别留下烂摊子

五、结语

首先,先来回顾一下,我们从基础到进阶,一步步揭开了 os 模块的神秘面纱:

  • 一、模块简介:明确了 os 是 Python 与操作系统对话的桥梁;

  • 二、模块详解:围绕路径操作、文件与目录管理、系统交互等内容进行了全面解析;

  • 三、实战案例:通过实用的例子,感受了 os 在实际项目中的威力;

  • 四、注意事项与最佳实践:总结了使用中的常见坑和避免方式,帮助你写出更健壮的代码。

当你开始掌握 os 模块,不仅可以实现自动化日常任务(比如清理文件、备份资料、批量重命名),还能够构建更高效的命令行工具、脚本管理程序,甚至构建你自己的系统管理软件。

或许现在的你已经能够轻松用 os 模块完成一系列操作,也或许你还在摸索,但别忘了,Python 的美妙之一就是:一切皆对象,万物皆模块,动手即自由。

所以,不妨在接下来的项目里试着加点“ os 的料”,给你的代码一点“系统级操作”的魔法!

今天整理操作系统板块时,发现内容略显冗长,但这些内容并非无用。对初学者而言,好的入门引导至关重要。经过这次梳理,我对一些不常用的知识点有了新的理解,它们正在慢慢印入脑海。后续我会继续努力完善,欢迎大家收藏点赞关注哦!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小z..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值