os标准库是Python的一个操作系统接口模块,提供一些方便使用操作系统相关功能的函数。当需要在Python代码中调用操作系统相关功能实现业务逻辑或无法直接使用命令行工具时,可以考虑使用此模块。
import os
目录
- 1 常用属性
- 2 文件或目录操作
- 3 os.path库常见路径操作
- 3.1 获取绝对路径:os.path.abspath(path)
- 3.2 获取基本名称:os.path.basename(path)
- 3.3 获取目录名称:os.path.dirname(path)
- 3.4 获取指定属性
- 3.5 判断是否存在:os.path.exists(path)
- 3.6 判断是否为绝对路径:os.path.isabs(path)
- 3.7 判断是否为已存在文件:os.path.isfile(path)
- 3.8 判断是否为已存在目录:os.path.isdir(path)
- 3.9 规范路径名:os.path.normcase(path)
- 3.10 拼接路径:os.path.join(path, *paths)
- 3.11 拆分目录:os.path.split(path)
- 3.12 拆分扩展名:os.path.splitext(path)
1 常用属性
1.1 操作系统的类型:os.name
os.name
获取操作系统的类型,可用于判断目前正在使用的平台,posix
表示Linux或maxOS,nt
表示Windows,java
表示Java虚拟机。
# macOS
print(os.name) # posix
1.2 操作系统的环境变量:os.environ
os.environ
获取操作系统的环境变量
print(os.environ)
1.3 当前目录(.):os.curdir
os.curdir
获取当前目录(等价于.
)。
print(os.curdir) # .
print(os.path.abspath(os.curdir)) # /users/hyperplasma/workspace/codes/Python/HyperExample
1.4 父目录(..):os.pardir
os.pardir
获取当前目录的父目录(等价于..
)。
print(os.pardir) # ..
print(os.path.abspath(os.pardir)) # /users/hyperplasma/workspace/codes/Python
1.5 路径分割符(/):os.sep
os.sep
可取代操作系统特定的路径分割符(/
)
train_path = "data" + os.sep + "CIFAR-10" + os.sep + "train"
print(train_path) # data/CIFAR-10/train
1.6 转义字符(\r\n):os.linesep
os.linesep
取代转义字符\r\n
。
print("akira" + os.linesep + "37")
# akira
# 37
2 文件或目录操作
2.1 执行shell命令:os.system(cmd)
os.system(cmd)
执行shell命令。返回值是脚本的退出状态码,0代表成功,1代表不成功。
# Jupyter notebook
print(os.system(r"pwd"), '\n')
# /users/hyperplasma/workspace/codes/Python/HyperExample
# 0
print(os.system(r"ls"))
2.2 获取当前目录:os.getcwd()
os.getcwd()
返回表示当前工作目录的字符串。
print(os.getcwd()) # /users/example/workspace/codes/Python/Example
2.3 更改当前目录:os.chdir(path)
os.chdir(path)
将当前工作目录更改为path。
print(os.getcwd()) # /Users/Example/workspace/codes/Python
os.chdir(r"../../")
print(os.getcwd()) # /Users/Example/workspace
2.4 列举目录文件:os.listdir(path='.')
os.listdir(path='.')
返回path路径(默认为当前目录)下所有文件和目录名的任意顺序排列的列表。
print(os.listdir()) # ['run.py', 'config.py', 'utils', 'models', 'test.py', 'train.py', 'data', 'my_dir', 'idea']
2.5 创建目录:os.mkdir(path)、os.makedirs(path)
os.mkdir(path)
创建一个路径为path的目录。
os.mkdir(r"./my_dir")
os.makedirs(path)
可生成多层递归目录。
os.makedirs(r"./models/ResNet")
2.6 删除目录:os.rmdir(path)、os.removedirs(path)
os.rmdir(path)
删除路径为path的目录,若路径不存在或非空,则会分别抛出FileNotFoundError
或OSError
异常。
os.rmdir(r"data")
os.removedirs(path)
可从最底层往前递归删除目录:若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依次类推。
os.removedirs(r"./data/CIFAR-10/mixed/test")
2.7 删除文件:os.remove(path)
os.remove(path)
删除指定文件(注意与前两个删除目录函数区分)。
os.remove(r"./data/CIFAR-10/unused/trash.jpeg")
2.8 重命名:os.rename(path1, path2)
os.rename(path1, path2)
用于重命名文件或文件夹,把path1更名为path2。
os.rename("my_dir", "name_changed")
3 os.path库常见路径操作
3.1 获取绝对路径:os.path.abspath(path)
os.path.abspath(path)
返回path路径的绝对路径(标准化的),path不存在也不会报错。
print(os.path.abspath(r"train.py")) # /Users/hyperplasma/workspace/codes/Python/HyperExample/train.py
3.2 获取基本名称:os.path.basename(path)
os.path.basename(path)
返回路径path的基本名称(即路径path的最末级文件)
print(os.path.basename(r"/Users/Example/workspace/codes/Python/Example/train.py")) # train.py
3.3 获取目录名称:os.path.dirname(path)
os.path.dirname(path)
返回路径path的目录名称(即路径path的最末级文件夹)
print(os.path.dirname(r"/Users/Example/workspace/codes/Python/Example/train.py")) # /Users/Example/workspace/codes/Python/Example
3.4 获取指定属性
os.path.getatime(path)
:返回path所指向的文件或者目录的最后访问时间。os.path.getmtime(path)
:返回path所指向的文件或者目录的最后修改时间os.path.getctime(path)
:返回path所指向的文件或者目录的创建时间os.path.getsize(path)
:返回文件大小,如果文件不存在就返回错误。
3.5 判断是否存在:os.path.exists(path)
os.path.exists(path)
判断path是否指向已存在的路径,存在返回True,不存在返回False。
print(os.path.exists(r"/Users/hyperplasma/workspace/codes/Python/HyperExample")) # True
print(os.path.exists(r"/Users/hyperplasma/workspace/codes/Python/nonexistence.java")) # False
3.6 判断是否为绝对路径:os.path.isabs(path)
os.path.isabs(path)
判断path是否为一个绝对路径,是返回True,不是返回False。
print(os.path.isabs(r"/Users/hyperplasma/workspace/codes/Python/HyperExample/config.py")) # True
print(os.path.isabs(r"./config.py")) # False
3.7 判断是否为已存在文件:os.path.isfile(path)
os.path.isfile(path)
:若path为指向一个已存在文件的符号链接或一个已存在文件路径,返回True。若path为一个文件夹路径或不存在路径,返回False。
print(os.path.isfile(r"./data/example.py")) # True
print(os.path.isfile(r"./data")) # False
print(os.path.isfile(r"./nonexistence")) # False
3.8 判断是否为已存在目录:os.path.isdir(path)
os.path.isdir(path)
:若path为指向一个已存在文件夹的符号链接或一个已存在文件夹路径,返回True。若path为一个文件路径或不存在路径,返回False。
print(os.path.isdir(r"./data/example.py")) # False
print(os.path.isdir(r"./data")) # True
print(os.path.isdir(r"./nonexistence")) # False
3.9 规范路径名:os.path.normcase(path)
os.path.normcase(path)
规范路径名称的大小写。 在Windows上,将路径名称中的所有字符转为小写,并将正斜杠转为反斜杠。 在其他操作系统上仅会修正斜杠数量,并化简路径表示。
# macOS
train_path = r".//////data////CIFAR-10//train/"
print(train_path) # .//////data////CIFAR-10//train/
print(os.path.normpath(train_path)) # data/CIFAR-10/train
3.10 拼接路径:os.path.join(path, *paths)
os.path.join(path, *paths)
拼接两个或多个路径部分,按需要插入/
。
- 若参数中某个部分是绝对路径,则绝对路径前的路径都将被丢弃,并从绝对路径部分开始连接。
- 若最后一部分为空,则结果将以分隔符结尾。
train_path = os.path.join("data", "CIFAR-10", "train")
print(train_path) # data/CIFAR-10/train
3.11 拆分目录:os.path.split(path)
os.path.split(path)
将路径path拆分成(head, tail)
两部分,其中head表示除去路径最后一部分外的所有木,tail表示路径最后一部分,且不会包含斜杠。
- 若path以斜杠结尾,tail将为空。
- 若path中没有斜杠,head将为空。
- 若果path为空,则head和tail均为空。
norm_path="/ResNet/train.py" # 一般路径
ends_with_slash_path="/Transformer/self-attention/" # 以斜杠结尾的路径
no_slash_path="PAT_logo.png" # 没有斜杠的路径
empty_path="" # 空路径
root_path="/" # 根目录
print("一般路径 head={}, tail={}".format(*os.path.split(norm_path))) # 一般路径 head=/ResNet, tail=train.py
print("以斜杠结尾的路径 head={}, tail={}".format(*os.path.split(ends_with_slash_path))) # 以斜杠结尾的路径 head=/Transformer/self-attention, tail=
print("没有斜杠的路径 head={}, tail={}".format(*os.path.split(no_slash_path))) # 没有斜杠的路径 head=, tail=PAT_logo.png
print("空路径 head={}, tail={}".format(*os.path.split(empty_path))) # 空路径 head=, tail=
print("根目录 head={}, tail={}".format(*os.path.split(root_path))) # 根目录 head=/, tail=
3.12 拆分扩展名:os.path.splitext(path)
os.path.splitext(path)
将路径path拆分成(root, ext)
两部分,使 root + ext == path,其中ext
为空或以英文句点开头(即扩展名),且最多包含一个句点。路径前的句点将被忽略。
例:splitext(‘.cshrc’)
返回 (‘.cshrc’, ‘’)
。
dir_path="/ResNet/data/" # 文件夹路径
multi_dot_file_path="/res/starter.thy.py" # 包含多个句点的文件路径
single_dot_file_path="/Python/main.py" # 包含单个句点的文件路径
starts_with_dot_file_path=".bashrc" # 以句点开头的路径
print("文件夹路径 root={}, ext={}".format(*os.path.splitext(dir_path))) # 文件夹路径 root=/ResNet/data/, ext=
print("包含多个句点的文件路径 root={}, ext={}".format(*os.path.splitext(multi_dot_file_path))) # 包含多个句点的文件路径 root=/res/starter.thy, ext=.py
print("包含单个句点的文件路径 root={}, ext={}".format(*os.path.splitext(single_dot_file_path))) # 包含单个句点的文件路径 root=/Python/main, ext=.py
print("以句点开头的路径 root={}, ext={}".format(*os.path.splitext(starts_with_dot_file_path))) # 以句点开头的路径 root=.bashrc, ext=