Python之os模块(文件和目录操作、进程管理、环境变量访问)

Python之os模块

os 模块是 Python 的标准库之一,提供了丰富的操作系统相关功能,包括文件和目录操作、进程管理、环境变量访问等。它允许 Python 程序与操作系统进行交互,实现跨平台的操作系统功能调用。

功能分类速查表

文件和目录操作

功能/属性说明示例
os.getcwd()获取当前工作目录current_dir = os.getcwd()
os.chdir(path)改变当前工作目录os.chdir(‘/new/path’)
os.listdir(path)返回指定目录下的文件和目录列表files = os.listdir(‘.’)
os.mkdir(path)创建目录os.mkdir(‘new_dir’)
os.makedirs(path)递归创建目录os.makedirs(‘dir1/dir2/dir3’)
os.remove(path)删除文件os.remove(‘file.txt’)
os.rmdir(path)删除空目录os.rmdir(‘empty_dir’)
os.removedirs(path)递归删除空目录os.removedirs(‘dir1/dir2’)
os.rename(src, dst)重命名文件或目录os.rename(‘old.txt’, ‘new.txt’)
os.stat(path)获取文件/目录状态信息info = os.stat(‘file.txt’)
os.path 子模块提供路径相关操作详见下方 os.path 部分
os.walk()递归遍历目录树for root, dirs, files in os.walk(top_path):

在这里插入图片描述

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

功能/属性说明示例
os.path.abspath(path)返回绝对路径abs_path = os.path.abspath(‘file.txt’)
os.path.basename(path)返回路径的最后部分os.path.basename(‘/a/b/c.txt’) → ‘c.txt’
os.path.dirname(path)返回目录部分os.path.dirname(‘/a/b/c.txt’) → ‘/a/b’
os.path.exists(path)检查路径是否存在if os.path.exists(‘file.txt’):
os.path.isfile(path)检查是否为文件if os.path.isfile(‘file.txt’):
os.path.isdir(path)检查是否为目录if os.path.isdir(‘directory’):
os.path.join(path1, path2)智能拼接路径os.path.join(‘dir’, ‘sub’, ‘file.txt’)
os.path.split(path)分割路径为目录和文件名dir, file = os.path.split(‘/a/b/c.txt’)
os.path.splitext(path)分割文件名和扩展名name, ext = os.path.splitext(‘file.txt’)
os.path.getsize(path)获取文件大小(字节)size = os.path.getsize(‘file.txt’)
os.path.getmtime(path)获取最后修改时间mtime = os.path.getmtime(‘file.txt’)

在这里插入图片描述

进程管理

功能/属性说明示例
os.system(command)执行系统命令os.system(‘ls -l’)
os.popen(command)执行命令并获取输出output = os.popen(‘ls’).read()
os.getpid()获取当前进程IDpid = os.getpid()
os.getppid()获取父进程IDppid = os.getppid()
os.kill(pid, sig)向进程发送信号os.kill(pid, signal.SIGTERM)
os._exit(n)直接退出进程(不清理)os._exit(1)

在这里插入图片描述

环境变量和用户信息

功能/属性说明示例
os.environ包含环境变量的字典home = os.environ[‘HOME’]
os.getenv(key)获取环境变量值path = os.getenv(‘PATH’)
os.putenv(key, value)设置环境变量os.putenv(‘MY_VAR’, ‘value’)
os.uname()获取系统信息(Unix)info = os.uname()
os.getlogin()获取当前登录用户名user = os.getlogin()
os.getuid()获取当前用户ID(Unix)uid = os.getuid()
os.getgid()获取当前组ID(Unix)gid = os.getgid()

在这里插入图片描述

文件描述符和权限

功能/属性说明示例
os.open(path, flags)低级文件打开fd = os.open(‘file.txt’, os.O_RDWR)
os.close(fd)关闭文件描述符os.close(fd)
os.read(fd, n)从文件描述符读取data = os.read(fd, 100)
os.write(fd, str)向文件描述符写入os.write(fd, b’data’)
os.chmod(path, mode)更改文件权限os.chmod(‘file.txt’, 0o755)
os.access(path, mode)检查文件权限if os.access(‘file.txt’, os.R_OK):
  • os.open() 和内置的 open() 函数
    • os.open():低级接口,适合特殊需求(如文件锁、原始字节操作)。

    • open():高级接口,适合日常文件读写(自动处理编码、缓冲和资源管理)。

    • 优先使用 open(),除非你有明确的理由需要使用 os.open()

  • 参考Python之文件操作

常用示例

遍历目录

import os

for root, dirs, files in os.walk('.'):
    for file in files:
        print(os.path.join(root, file))

创建目录结构

import os

if not os.path.exists('project/data'):
    os.makedirs('project/data')

文件操作

import os

# 复制文件(简单方式)
with open('source.txt', 'rb') as src, open('dest.txt', 'wb') as dst:
    dst.write(src.read())

# 删除文件前检查
if os.path.isfile('old_file.txt'):
    os.remove('old_file.txt')

获取文件信息

import os
import time

file_stat = os.stat('document.pdf')
print(f"大小: {file_stat.st_size} 字节")
print(f"最后修改: {time.ctime(file_stat.st_mtime)}")

跨平台路径处理

import os

config_path = os.path.join(os.getenv('HOME'), 'config', 'settings.ini')
print(f"配置文件路径: {config_path}")

其他补充点

'\'转义字符注意事项

使用原始字符串(推荐)

在路径字符串前加 r,告诉 Python 不要处理转义字符:

print(os.path.isfile(r'D:\pycharm\project01\day04\模块.py'))
#           注意这里的 `r` ↑
使用双反斜杠\\

手动转义每个反斜杠:

print(os.path.isfile('D:\\pycharm\\project01\\day04\\模块.py'))
使用正斜杠 /(Python 自动兼容)

即使是在 Windows 系统,Python 也支持 / 作为路径分隔符:

print(os.path.isfile('D:/pycharm/project01/day04/模块.py'))

在这里插入图片描述

创建或删除需要判断是否存在

创建文件/目录
  • 是否需要判断存在?
    • 不必须:Python 的创建操作(如 open()、os.makedirs())在目标已存在时可能会报错,但可以通过参数直接覆盖或忽略。

    • 推荐做法:

      • 文件:使用 ‘w’ 模式直接覆盖,或 ‘x’ 模式确保不覆盖(需捕获 FileExistsError)。
      try:
          with open('file.txt', 'x') as f:  # 文件存在时报错
              f.write('content')
      except FileExistsError:
          print("文件已存在,未覆盖")
      
      • 目录:使用 os.makedirs(exist_ok=True) 自动忽略已存在的目录。
      import os
      os.makedirs('my_dir', exist_ok=True)  # 目录存在时不报错
      
删除文件/目录
  • 是否需要判断存在?

    • 不必须:删除前检查存在性可避免异常,但直接捕获异常更简洁(Python 推崇 EAFP 风格)。
  • 推荐做法:

    • 文件:直接删除 + 捕获 FileNotFoundError。
    import o
    try:
        os.remove('file.txt')  # 文件不存在时报错
    except FileNotFoundError:
        print("文件不存在,无需删除")
    
    • 目录:使用 shutil.rmtree() 递归删除(无视存在性)。
    import shutil
    shutil.rmtree('my_dir', ignore_errors=True)  # 目录不存在时不报错
    
  • 性能:直接操作 + 异常处理的性能通常优于先检查(尤其在高并发场景)

在这里插入图片描述

__pycache__ 缓存目录

  • 使用os.listdir()查看指定目录下的文件和目录列表时,可以看到该目录
  • 当导入一个 Python 模块(如 import mymodule)时,Python 会将模块的源代码(.py 文件)编译成字节码(一种优化后的二进制格式),并保存在__pycache__目录中
    __pycache__ 是 Python 用于优化模块加载的缓存目录,无需手动干预,可以安全忽略或删除。
  • 作用
    • 性能优化:直接加载已编译的字节码比重新解析 .py 文件更快,尤其是对于大型模块。

    • 避免重复编译:如果模块未修改,Python 会直接复用字节码,跳过编译步骤。

  • 一般编辑器/IDE 默认隐藏了它
    在这里插入图片描述

windows打印os.system(“dir”) 会乱码

在这里插入图片描述

乱码原因
  • os.system() 直接调用系统命令,返回的是 系统原生编码(GBK)。

  • 如果 Python 或终端尝试用 UTF-8 解码 GBK 内容,就会显示乱码(如 � 或奇怪符号)。

修改控制台编码为 UTF-8(推荐)

在代码开头强制设置终端编码:

import os
import sys

# 设置控制台编码为 UTF-8
sys.stdout.reconfigure(encoding='utf-8')  # Python 3.7+
os.system("chcp 65001")  # Windows 切换到 UTF-8 代码页

print(os.system("dir"))  # 现在应该正常显示中文

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值