Python3 os 模块及应用

🎉摘要:本文深入解析 Python os 模块,涵盖环境变量、目录操作、文件管理、路径处理及进程控制。提供跨平台兼容的代码示例,详解 os.getcwd、os.mkdir、os.path.join 等核心函数用法,帮助开发者高效实现系统交互与文件处理,掌握异常处理与安全注意事项。

在 Python 中,os 是内置的系统交互模块,无需额外安装,直接导入即可使用,它主要用于操作系统交互,专门用来处理文件、目录、路径、系统环境等等。

os 模块封装了不同操作系统(Windows/Linux/Mac)的底层接口,提供统一的文件、目录操作方法,屏蔽系统差异。这样我们在处理文件时就不需要关注操作系统间的差异,如文件路径分隔符,windows 使用“\”,Linux 操作系统使用“/”。

注意:本模块中的所有函数在文件名或路径无效、无法访问,或其他参数类型正确但操作系统不接受的情况下,均会抛出OSError(或其子类)异常。

环境变量操作

指在操作系统或运行环境中预先设置、可供程序和系统读取的动态参数,它们不直接写入程序代码,而是以变量形式存在于系统环境中。

简单来说,环境变量相当于系统和应用程序之间的通用配置信息,能够让程序在不同环境下灵活适配,无需修改源代码即可调整运行状态,常见的用途包括指定可执行文件的搜索路径、设置系统默认语言、配置程序运行所需的参数等。

在 Python 中,可以通过如下方法对环境变量进行读取、设置和删除:

  • os.getenv(key, default=None)   获取环境变量,不存在则返回默认值

  • os.environ   类似字典的对象,包含所有环境变量

  • os.environ[key] = value   设置环境变量

  • del os.environ[key]   删除环境变量

示例:

# 导入 os 模块
import os

# 获取环境变量
print("获取单个环境变量:")
print(f"PATH: {os.getenv('PATH')[:50]}...")  # 只显示前50个字符
print(f"USER: {os.getenv('USER', '未知用户')}")  # 提供默认值

# 获取所有环境变量
print("\n所有环境变量:")
env_vars = os.environ
print(f"环境变量数量: {len(env_vars)}")
print(f"HOME: {env_vars.get('HOME')}")

# 设置环境变量(仅在当前进程有效)
os.environ['MY_VAR'] = 'my_value'
print(f"\n设置的环境变量 MY_VAR: {os.getenv('MY_VAR')}")

# 删除环境变量
if 'MY_VAR' in os.environ:
    del os.environ['MY_VAR']
print(f"删除后 MY_VAR: {os.getenv('MY_VAR')}")

运行结果:

获取单个环境变量:
PATH: d:\anaconda3;D:\anaconda3;D:\anaconda3\Library\min...
USER: 未知用户

所有环境变量:
环境变量数量: 122
HOME: None

设置的环境变量 MY_VAR: my_value
删除后 MY_VAR: None

目录操作

目录操作指对文件系统中的目录进行操作,如创建目录、删除目录、获取当前目录等等,Python 中,操作目录的主要方法如下:

  • os.getcwd()   获取当前工作目录

  • os.chdir(path)   更改当前工作目录

  • os.mkdir(path)   创建单个目录

  • os.makedirs(path, exist_ok=False)   创建多级目录

  • os.listdir(path='.')   列出目录中的文件和子目录

  • os.rmdir(path)   删除空目录

示例:

# 导入 os 模块
import os

# 获取当前工作目录
current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}")

# 创建新目录
new_dir = "test_dir"
try:
    os.mkdir(new_dir)
    print(f"已创建目录: {new_dir}")
except FileExistsError:
    print(f"目录 {new_dir} 已存在")

# 创建多级目录
multi_dir = "parent_dir/child_dir/grandchild_dir"
try:
    os.makedirs(multi_dir, exist_ok=True)  # exist_ok=True 避免目录存在时出错
    print(f"已创建多级目录: {multi_dir}")
except Exception as e:
    print(f"创建多级目录出错: {e}")

# 更改工作目录
try:
    os.chdir(new_dir)
    print(f"当前工作目录已更改至: {os.getcwd()}")
    os.chdir(current_dir)  # 改回原目录
except FileNotFoundError:
    print(f"目录 {new_dir} 不存在")

# 列出目录内容
print(f"\n{current_dir} 目录内容:")
for item in os.listdir(current_dir):
    print(f"  {item}")

# 删除目录
try:
    os.rmdir(new_dir)
    print(f"已删除目录: {new_dir}")
except OSError as e:
    print(f"删除目录 {new_dir} 失败: {e}")

# 删除多级目录(需确保目录为空)
import shutil
try:
    shutil.rmtree("parent_dir")
    print("已删除多级目录: parent_dir")
except OSError as e:
    print(f"删除多级目录失败: {e}")

运行结果:

当前工作目录: d:\$share_dir\workspace\4.learn\Python3\3.modules
已创建目录: test_dir
已创建多级目录: parent_dir/child_dir/grandchild_dir
当前工作目录已更改至: d:\$share_dir\workspace\4.learn\Python3\3.modules\test_dir

d:\$share_dir\workspace\4.learn\Python3\3.modules 目录内容:
  basic_data.csv
  basic_writer.csv
  ...
  test_dir
  tmp.py
  users.json
已删除目录: test_dir
已删除多级目录: parent_dir

文件操作

文件操作指直接对文件进行创建、删除、重命名、权限修改等等,Python 提供的关于文件操作的主要方法如下:

  • os.rename(src, dst)   重命名或移动文件/目录

  • os.remove(path)   删除文件

  • os.path.exists(path)   检查路径是否存在

  • os.path.isfile(path)   检查是否为文件

  • os.path.isdir(path)   检查是否为目录

  • os.path.getsize(path)   获取文件大小(字节)

示例:

import os

# 创建文件(通常用open(),这里展示os模块相关功能)
filename = "test_file.txt"
with open(filename, 'w') as f:
    f.write("测试文件内容")

# 重命名文件
new_filename = "renamed_file.txt"
try:
    os.rename(filename, new_filename)
    print(f"文件已重命名: {filename} -> {new_filename}")
except FileNotFoundError:
    print(f"文件 {filename} 不存在")

# 移动文件(与重命名类似,可跨目录)
target_dir = "test_move_dir"
os.makedirs(target_dir, exist_ok=True)
target_path = os.path.join(target_dir, new_filename)
os.rename(new_filename, target_path)
print(f"文件已移动至: {target_path}")

# 删除文件
try:
    os.remove(target_path)
    print(f"已删除文件: {target_path}")
    os.rmdir(target_dir)  # 同时删除空目录
except OSError as e:
    print(f"删除文件失败: {e}")

# 检查文件/目录是否存在
check_file = "existing_file.txt"
print(f"\n文件 {check_file} 是否存在: {os.path.exists(check_file)}")

# 创建临时文件并检查属性
with open(check_file, 'w') as f:
    f.write("临时内容")

print(f"{check_file} 是否为文件: {os.path.isfile(check_file)}")
print(f"{check_file} 是否为目录: {os.path.isdir(check_file)}")
print(f"{check_file} 绝对路径: {os.path.abspath(check_file)}")
print(f"{check_file} 大小: {os.path.getsize(check_file)} 字节")

# 最后删除测试文件
os.remove(check_file)

运行结果:

文件已重命名: test_file.txt -> renamed_file.txt
文件已移动至: test_move_dir\renamed_file.txt
已删除文件: test_move_dir\renamed_file.txt

文件 existing_file.txt 是否存在: False
existing_file.txt 是否为文件: True
existing_file.txt 是否为目录: False
existing_file.txt 绝对路径: d:\$share_dir\workspace\4.learn\Python3\3.modules\existing_file.txt
existing_file.txt 大小: 12 字节

路径处理

路径处理指在程序开发中,对文件、目录或数据的访问路径进行规范化、拼接、解析、校验与转换的一系列操作。

路径处理通常用于确保路径格式统一、适配不同操作系统的路径规则、避免路径错误或安全风险,同时提升文件定位与数据读取的准确性与稳定性。例如,处理路径分隔符(Windows 使用反斜杠,Linux 使用斜杠),避免用户通过“..”符号访问未授权的目录。

Python 提供用于路径处理的主要方法如下:

  • os.path.join(path1, path2, ...)   智能拼接路径,在拼接多个路径时,自动处理不同系统的路径分隔符,特别是在 Windows 中,URL 地址使用 / 分隔符,磁盘路径使用 \ 分隔符,将磁盘路径拼接为 URL 地址时可以使用。

  • os.path.dirname(path)   获取路径中的目录部分

  • os.path.basename(path)   获取路径中的文件名部分

  • os.path.splitext(path)   分离文件名和扩展名,返回一个元组,例如 ('report', '.pdf')

  • os.path.abspath(path)   获取绝对路径,例如 d:\$share_dir\workspace\4.learn\Python3\config.ini

  • os.path.normpath(path)   规范化路径,自动处理路径中的“.”和“..”

示例:

import os

# 路径拼接(自动处理不同系统的路径分隔符)
dir_name = "data"
file_name = "results.txt"
full_path = os.path.join(dir_name, file_name)
print(f"拼接路径: {full_path}")

# 路径分解
path = "/home/user/docs/report.pdf"
print(f"\n分解路径: {path}")
print(f"目录部分: {os.path.dirname(path)}")
print(f"文件名部分: {os.path.basename(path)}")
print(f"文件名和扩展名: {os.path.splitext(os.path.basename(path))}")

# 绝对路径
relative_path = "../config.ini"
print(f"\n相对路径: {relative_path}")
print(f"绝对路径: {os.path.abspath(relative_path)}")

# 规范化路径(处理.和..)
messy_path = "/home/user/../docs/./report.pdf"
print(f"不规范路径: {messy_path}")
print(f"规范化路径: {os.path.normpath(messy_path)}")

# 跨平台路径处理
print(f"\n当前系统路径分隔符: {os.sep}")
print(f"当前系统行终止符: {repr(os.linesep)}")

运行结果:

拼接路径: data\results.txt

分解路径: /home/user/docs/report.pdf
目录部分: /home/user/docs
文件名部分: report.pdf
文件名和扩展名: ('report', '.pdf')

相对路径: ../config.ini
绝对路径: d:\$share_dir\workspace\4.learn\Python3\config.ini
不规范路径: /home/user/../docs/./report.pdf
规范化路径: \home\docs\report.pdf

当前系统路径分隔符: \
当前系统行终止符: '\r\n'

进程管理

Python 中的进程是操作系统进行资源分配和调度的基本单位,每个进程拥有独立的内存空间、文件描述符等系统资源,确保不同任务之间的隔离性。与线程不同,进程的多任务执行可真正利用多核 CPU 的并行能力,有效突破 Python 全局解释器锁(GIL)对计算密集型任务的限制,尤其适用于大数据处理、批量任务执行、CPU密集型运算等场景。

Python 中,os 模块关于进程的主要方法如下:

  • os.getpid()   获取当前进程ID

  • os.getppid()   获取父进程ID

  • os.system(command)   执行系统命令,返回退出状态

  • os.popen(command)   执行系统命令,返回文件对象以读取输出

示例:

import os
import time

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

# 获取父进程ID
print(f"父进程ID: {os.getppid()}")

# 在Windows和Unix上执行系统命令
try:
    if os.name == 'nt':  # Windows系统
        # 执行dir命令并获取输出
        os.system('dir')
    else:  # Unix/Linux/Mac系统
        # 执行ls命令并获取输出
        os.system('ls -l')
except Exception as e:
    print(f"执行命令出错: {e}")

# 使用os.popen获取命令输出
print("\n使用os.popen获取命令输出:")
try:
    if os.name == 'nt':
        with os.popen('echo %USERNAME%') as f:
            print(f"当前用户: {f.read().strip()}")
    else:
        with os.popen('echo $USER') as f:
            print(f"当前用户: {f.read().strip()}")
except Exception as e:
    print(f"获取命令输出出错: {e}")

# 注意:更推荐使用 subprocess 模块进行进程管理

运行结果:

当前进程ID: 15452
父进程ID: 14048

使用os.popen获取命令输出:
当前用户: Administrator

os 模块使用注意事项:

(1)跨平台兼容性:不同操作系统(Windows、Linux、macOS)的路径分隔符、环境变量等存在差异。尽量使用 os.path 模块的方法处理路径,而非硬编码 / 或 \。使用 os.name 判断操作系统类型('nt' 表示 Windows,'posix' 表示 Unix 类系统)

(2)错误处理:文件和目录操作可能抛出多种异常(FileNotFoundError、PermissionError 等),进行文件操作时应使用 try-except 块捕获异常

(3)安全性:使用 os.system() 或 os.popen() 执行外部命令时要注意安全风险,避免将用户输入直接传递给这些命令,以防命令注入攻击

(4)替代模块:

  • pathlib 模块提供了面向对象的路径处理方式,是 os.path 的现代替代

  • subprocess 模块比 os.system() 和 os.popen() 更强大,推荐用于进程管理

  • shutil 模块提供了更高级的文件操作功能

注意:os 模块是 Python 与操作系统交互的基础,掌握其常用方法对于文件处理、系统管理脚本编写等任务非常重要。

更多关于 os 模块的信息请参考 https://docs.python.org/3/library/os.html 文档。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号