「作者主页」:士别三日wyx
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「推荐专栏」:小白零基础《Python入门到精通》
os模块详解
- 1、文件目录操作
- os.stat() 获取文件状态
- os.utime() 修改文件时间
- os.rename() 修改文件/目录
- os.renames() 递归修改文件/目录
- os.replace() 替换文件/目录
- os.remove() 删除文件
- os.getcwd() 获取工作目录
- os.getcwdb() 获取工作目录
- os.chdir() 修改工作目录
- os.mkdir() 创建目录
- os.makedirs() 创建多级目录
- os.rmdir() 删除目录
- os.removedirs() 删除多级目录
- 2、系统信息
- os.name 获取操作系统类型
- os.environ 获取环境变量
- os.getenv() 获取环境变量
- os.get_exec_path() 获取可执行文件路径
- os.cpu_count() 获取CPU数量
- os.getlogin() 获取登录用户
- os.getpid() 获取当前进程ID
- os.getppid() 获取父进程ID
- os.urandom() 获取随机字节
- 2、进程管理
- os.times() 获取进程时间
- os.abort() 中断当前进程
- os.system() 执行系统命令
- os.popen() 执行shell命令
- os.startfile() 打开文件
- 3、错误/异常
- BlockingIOError
- ChildProcessError
- ConnectionError
- BrokenPipeError
- ConnectionAbortedError
- ConnectionRefusedError
- ConnectionResetError
- FileExistsError
- FileNotFoundError
- InterruptedError
- IsADirectoryError
- NotADirectoryError
- PermissionError
- ProcessLookupError
- TimeoutError
OS标准库是操作系统接口模块,提供了操作系统相关功能的调用函数。
使用OS标准库前,需要导入模块 import os
1、文件目录操作
os.stat() 获取文件状态
获取文件或文件描述符的状态,返回一个 stat_result 对象。
stat_result对象有很多可以调用的属性:
- st_atime:最近访问时间,单位秒
- st_mtime:最近修改时间,单位秒
- st_ctime:文件创建时间(Windows),修改时间(unix),单位秒
- st_size:文件大小,单位字节
- st_uid:文件所有者的ID
- st_nlink:硬链接数量
- st_dev:文件所在设备的标识符
- st_ino:文件的唯一标识(Windows是文件索引号,Unix是索引节点号)
- st_mode:文件模式,包括文件类型和文件模式位(即权限位)。
- st_atime_ns:最近访问时间,单位纳秒
- st_mtime_ns:最近修改时间,单位纳秒
- st_ctime_ns:文件创建时间(Windows),修改时间(unix),单位纳秒
还有一些属性需要在Unix系统上才能调用:
- st_blocks:文件的字节块数,每块512字节。
- st_blksize:“首选的” 块大小,用于提高文件系统 I/O 效率。写入文件时块大小太小可能会导致读取-修改-重写效率低下。
- st_rdev:设备类型(针对inode设备)
- st_flags:文件标志位(用户定义的)
- st_gen:文件生成号
- st_birthtime:文件创建时间
os.utime() 修改文件时间
修改文件的访问时间和修改时间,修改后需要重新获取 stat_result 对象,才会更新。
语法
os.uime( path, (atime, mtime))
参数
- path:(必选)文件路径
- atime:(必选)文件访问时间
- mtime:(必选)文件修改时间
实例
import osos.utime('newDir/myFile', (1491413771, 1591413771))
statResult = os.stat('newDir/myFile')
print(statResult.st_atime)
print(statResult.st_mtime)
输出:
1491413771.0
1591413771.0
os.rename() 修改文件/目录
修改文件名或目录名。
语法
os.rename( src, dst )
参数
- src:(必选)源文件/目录,即需要修改的文件/目录
- dst:(必选)目的文件/目录,即修改后的文件/目录
实例
import osos.rename('myFile', 'newName')
对于Windows系统,文件名已存在会报错 FileExistsError。
对于Unix系统,将文件重命名为目录会报错 IsADirectoryError;将目录重命名为文件会报错 NotADirectoryError。
os.renames() 递归修改文件/目录
递归修改文件名或目录名。先创建所需要的中间目录,重命名后,再调用 removedirs() 删除旧路径中不需要的目录。
语法
os.renames( old, new )
参数
- old:(必选)旧路径
- new:(必选)新路径
实例
import osos.renames('myFile', 'newDir/myFile')
os.replace() 替换文件/目录
修改文件名或目录名,如果文件名已存在,则会静默修改;如果目录已存在,则会报错 OSError。
语法
os.replace( old, new )
参数
- old:(必选)修改前的路径
- new:(必选)修改后的路径
实例
import osos.replace('myFile', 'newDir/myFile')
os.remove() 删除文件
删除文件,删除目录会报错 FileNotFoundError
语法
os.remove( path )
参数
- path:(必选)文件路径(绝对路径/相对路径)
实例
import osos.remove('myFile')
os.getcwd() 获取工作目录
获取当前工作目录,也就是当前所在路径,返回字符串类型。
import osprint(os.getcwd())
输出:
E:\data\PrCharm\pythonProject1
os.getcwdb() 获取工作目录
获取当前工作目录,二进制序列(bytes)类型。
import osprint(os.getcwdb())
输出:
b'E:\\data\\PrCharm\\pythonProject1'
os.chdir() 修改工作目录
修改当前工作目录
语法
os.chdir( path )
参数
- path:(必选,str类型)需要修改的路径
实例
import osos.chdir('E://data')
print(os.getcwd())
输出:
E:\data
os.mkdir() 创建目录
创建目录,如果目录已存在会报错 FileExistsError,如果路径中父目录不存在会报错 FileNotFoundError。
语法
os.mkdir( path, mode )
参数
- path:(必选)目录的路径(绝对路径/相对路径)
- mode:目录的权限(某些系统会忽略)
实例
import osos.mkdir('myDir')
当前目录下创建了目录
os.makedirs() 创建多级目录
创建多级目录,上级目录不存在也会自动创建。
语法
os.makedirs( path, mode )
参数
- path:(必选)目录的路径(绝对路径/相对路径)
- mode:目录的权限(某些系统会忽略)
实例
import osos.makedirs('myDir/dir1')
当前目录下创建了目录
os.rmdir() 删除目录
删除目录,如果目录不存在,会报错 FileNotFoundError;如果目录不为空,会报错 OSError。
语法
os.rmdir( path )
参数
- path:(必选)需要删除的目录(绝对路径/相对路径)
实例
import osos.rmdir('newDir')
os.removedirs() 删除多级目录
递归删除多级目录,如果删除了最后一级目录,会尝试依次删除上级目录(删除不掉不会报错,因为大多是因为目录不为空)。
语法
os.removedirs( path )
参数
- path:(必选)目录路径
实例
import osos.removedirs('myDir/dir1')
2、系统信息
os.name 获取操作系统类型
获取操作系统的类型,只有三个值nt
、posix
、java
- nt:Windows系统
- posix:Linux/mac系统
- java:java虚拟机
比如,我的电脑是Windows,就返回 nt
import osprint(os.name)
输出:
nt
os.environ 获取环境变量
获取系统环境变量等各种系统信息(导入OS模块时自动收集),字典格式,可以根据建获取
Windows常用字段
os.environ['HOMEPATH'] # 当前用户主目录。
os.environ['TEMP'] # 临时目录路径。
os.environ["PATHEXT"] # 可执行文件。
os.environ['SYSTEMROOT'] # 系统主目录。
os.environ['LOGONSERVER'] # 机器名。
Linux常用字段
os.environ['USER'] # 当前使用用户。
os.environ['LC_COLLATE'] # 路径扩展的结果排序时的字母顺序。
os.environ['SHELL'] # 使用shell的类型。
os.environ['LAN'] # 使用的语言。
os.environ['SSH_AUTH_SOCK'] # ssh的执行路径。
环境变量的增删改查操作
import osenviron = os.environ
# 新增
environ['环境变量名'] = '环境变量值'
# 删除
del environ['环境变量名']
# 修改
environ['环境变量名'] = '新环境变量值'
# 查询(变量不存在则返回默认值)
environ['环境变量名']
environ.get('环境变量名', '默认值')
# 判断(存在返回True,不存在返回False)
'环境变量值' in environ
os.getenv() 获取环境变量
根据环境变量名,获取环境变量的值,如果环境变量名不存在,就返回default。
语法
os.getenv( key, default )
参数
- key:(必选,str类型)环境变量名
- default:(可选)环境变量不存在时返回,默认值是 None
实例
import osprint(os.getenv('TEMP'))
输出:
C:\Users\WANGYU~1\AppData\Local\Temp
os.get_exec_path() 获取可执行文件路径
获取可执行文件路径,从 environ 对象中,返回可执行文件目录的列表。
语法
os.get_exec_path( environ )
参数
- environ:(可选)默认值None,即使用当前的 environ。
实例
import osprint(os.get_exec_path())
输出:
['E:\\data\\PrCharm\\pythonProject1\\venv\\Scripts', 'C:\\......
os.cpu_count() 获取CPU数量
返回系统的CPU数量,不确定就返回None。
语法
os.cpu_count()
实例
import osprint(os.cpu_count())
输出:
8
os.getlogin() 获取登录用户
获取当前登录用户,准确来说,是通过控制终端进程进行登录的用户名。
import osprint(os.getlogin())
os.getpid() 获取当前进程ID
获取当前进程ID
import osprint(os.getpid())
输出:
8212
os.getppid() 获取父进程ID
获取当前进程的父进程ID
import osprint(os.getppid())
输出:
14132
os.urandom() 获取随机字节
获取指定大小的随机字节,常用于加密。
语法
os.urandom( size )
参数
- size:(必选)指定随机字节的大小
实例
mport osprint(os.urandom(8))
输出:
b'\xb1\n\xbaw2\x88\x84\xf8'
2、进程管理
创建和管理进程的函数。
os.times() 获取进程时间
返回当前的全局进程时间,列表形式,有5个属性。
- user:用户时间
- system:系统时间
- children_user:所有子进程的用户时间
- children_system:所有子进程的系统时间
- elapsed:从过去的固定时间点起,经过的真实时间
Windows系统上,只有user、system两个属性有值,其他均为0。
语法
os.times()
实例
import ostimes = os.times()
print(times)
输出:
nt.times_result(user=0.046875, system=0.109375, children_user=0.0, children_system=0.0, elapsed=0.0)
os.abort() 中断当前进程
发送SIGABRT
信号给当前进程,用来终止进程,如果进程没有中断,则函数不会返回。
- Unix系统会生成一个核心转储文件
- Windows系统立即返回退出代码
语法
os.abort()
比如,当程序出现严重错误时,调用 os.abort() 终止进程。
import ostry:# 业务代码pass
except:os.abort()
补充:
- SIGABRT用来中止一个程序,处理函数返回后,所有打开的文件描述符将会被关闭,流也会被flush,程序也会结束。
- SIGABRT是一个暴力信号,可能会破坏进程的状态,应该谨慎使用。
os.system() 执行系统命令
执行系统命令,并在控制台输出执行结果
语法
os.system( commend )
参数
- commend:(必选)需要执行的命令
实例
import osos.system('ping www.baidu.com')
输出:
���� Ping www.a.shifen.com [39.156.66.18] ���� 32 �ֽڵ�����:
���� 39.156.66.18 �Ļظ�: �ֽ�=32 ʱ��=17ms TTL=50
���� 39.156.66.18 �Ļظ�: �ֽ�=32 ʱ��=16ms TTL=50
os.popen() 执行shell命令
通过Python执行系统命令,返回命令的执行结果(文本类型的对象)。
语法
os.popen( command, mode, buffer )
参数
- command:(必选)需要执行的命令
- mode:(可选)文件打开模式,默认值
r
(只读模式) - buffer:缓冲区大小,
实例
import osout = os.popen('ping www.baidu.com')
print(out.read())
输出:
正在 Ping www.a.shifen.com [39.156.66.14] 具有 32 字节的数据:
来自 39.156.66.14 的回复: 字节=32 时间=13ms TTL=50
来自 39.156.66.14 的回复: 字节=32 时间=48ms TTL=50
os.startfile() 打开文件
自动打开文件,绝对路径要用/
,相对路径要用 \
语法
os.startfile( path )
实例
import osos.startfile('newDir\myFile')
执行后,桌面上会打开指定的文件。
3、错误/异常
OS模块所有函数都会抛出OSError
及其子类
BlockingIOError
OSError
的子类
当在设置为非阻塞操作的对象(例如:套接字)上,执行阻塞操作时触发。
ChildProcessError
OSError
的子类
子进程上的操作失败时触发。
ConnectionError
OSError
的子类
与连接相关的问题的基类,常见的有它的子类。
BrokenPipeError
ConnectionError
的子类
管道中断时触发。
管道是单向通信的,在管道另一端关闭时写入,或者在已经关闭的套接字上写入,都会导致管道中断。
ConnectionAbortedError
ConnectionError
的子类
连接被对端终止时触发。
这种异常通常意味着网络连接被意外中断,可能是服务器出现故障、网络拥堵等原因导致的,比如 服务器返回的响应超时或断开了连接。
ConnectionRefusedError
ConnectionError
的子类
连接被对方拒绝时触发。
常见的原因有:
- 你想连接的服务器没有启动相关服务
- 防火墙阻止连接
- 端口被占用,关闭占用端口的服务
- IP或端口错误
ConnectionResetError
ConnectionError
的子类
对端重置连接时触发。
常见的原因有:
- 高延迟或丢包等网络错误导致连接中断
- 防火墙等ACL访问控制出于安全原因阻止了连接
FileExistsError
OSError
的子类
创建的文件或目录已经存在时触发
FileNotFoundError
OSError
的子类
请求的文件或目录不存在时触发
InterruptedError
OSError
的子类
系统调用被传入信号中断时触发
IsADirectoryError
OSError
的子类
对目录执行文件操作时触发
NotADirectoryError
OSError
的子类
对文件执行目录操作时触发
PermissionError
OSError
的子类
执行的操作没有足够的访问权限时触发
ProcessLookupError
OSError
的子类
指定的进程不存在时触发
TimeoutError
OSError
的子类
系统功能在系统级别的超时时触发