os模块
【一】概要
【二】常见用法
- 文件和目录操作:
os.getcwd()
: 获取当前工作目录。
os.chdir(path)
: 切换当前工作目录。
os.listdir(path='.')
: 返回指定目录下的所有文件和目录的列表。
os.mkdir(path)
: 创建目录。
os.makedirs(path)
: 递归创建多层目录。
os.remove(path)
: 删除文件。
os.rmdir(path)
: 删除目录。
os.removedirs(path)
: 递归删除多层目录。
- 路径操作:
os.path.join(path, *paths)
: 将多个路径组合成一个路径。
os.path.abspath(path)
: 返回路径的绝对路径。
os.path.basename(path)
: 返回路径的基本名称。
os.path.dirname(path)
: 返回路径的目录名称。
os.path.exists(path)
: 判断路径是否存在。
os.path.isfile(path)
: 判断路径是否为文件。
os.path.isdir(path)
: 判断路径是否为目录。
- 系统环境变量:
os.environ
: 包含系统环境变量的字典。
os.environ.get('VAR_NAME')
: 获取指定环境变量的值。
- 执行系统命令:
os.system(command)
: 在子shell中执行系统命令。
- 文件和目录状态:
os.stat(path)
: 获取文件或目录的状态信息。
- 路径拆分:
os.path.split(path)
: 将路径拆分为目录和文件名。
- 路径拓展:
os.path.expanduser(path)
: 展开 ~
和 ~user
。
os.path.expandvars(path)
: 展开环境变量。
- 进程控制:
os.fork()
: 在 Unix 系统中创建子进程。
os.kill(pid, signal)
: 向进程发送信号。
【三】详解
【1】文件和目录操作:
os.getcwd()
: 获取当前工作目录。
import os
res = os.getcwd()
print(res)
# D:\Files\Python\pythonProject1
os.chdir(path)
: 切换当前工作目录。
import os
# 执行文件的工作目录
res = os.getcwd()
print(res) # D:\Files\Python\pythonProject1
# 指定文件的工作目录
os.chdir(r"D:\Files\Python\pythonProject1\test")
# 当前工作目录为修改后的test文件目录下
# 以下做的所有修改均在test文件目录下,如创建文件等
res = os.getcwd()
print(res) # D:\Files\Python\pythonProject1\test
os.listdir(path='.')
: 返回指定目录下的所有文件和目录的列表。
import os
# os.getcwd() 当前的文件路径
print(os.listdir(os.getcwd()))
# ['.idea', '000.py', 'test', 'test.py', 'test_outer', '__pycache__']
# .xxx的文件是隐藏文件
os.mkdir(path)
: 创建目录。
- 如果文件夹已经存在将会报错
[WinError 183] 当文件已存在时,无法创建该文件。: 'test_outer'
import os
os.mkdir(path='test_outer')
# 在当前文件目录下创建 test_outer 文件夹
os.mkdir(path=r'D:\Files\Python\pythonProject1\test\test_inner')
# 可以通过绝对路径创建文件夹
import os
os.mkdir(path='test_outer.json')
os.makedirs(path)
: 递归创建多层目录。
import os
# mkdir 是无法创建多层目录的
os.mkdir(r'D:\Files\Python\pythonProject1\test\test1')
# [WinError 3] 系统找不到指定的路径。: 'D:\\Files\\Python\\pythonProject1\\test\\test1'
# 需要使用makedirs
os.makedirs(r'D:\Files\Python\pythonProject1\test\test1')
os.remove(path)
: 删除文件。
import os
os.remove(r'D:\Files\Python\pythonProject1\test\test1\0021.py')
# 通过路径删除 0021.py 文件
'''不能删除文件夹'''
os.remove(r'D:\Files\Python\pythonProject1\test\test1')
# PermissionError: [WinError 5] 拒绝访问。: 'D:\\Files\\Python\\pythonProject1\\test\\test1'
os.rmdir(path)
: 删除目录。
import os
os.rmdir(r'D:\Files\Python\pythonProject1\test\test1')
# 通过路径删除 test1 这个文件夹
'''需要在文件夹下没有文件了,才可以删除,如果不为空,则会报错'''
# OSError: [WinError 145] 目录不是空的: 'D:\\Files\\Python\\pythonProject1\\test\\test1'
os.removedirs(path)
: 递归删除多层目录。
import os
os.removedirs('test/test1')
# 递归删除 test 文件目录下的所有文件目录
'''同样需要在文件夹下没有文件了,才可以删除,如果不为空,则会报错'''
# OSError: [WinError 145] 目录不是空的
【2】路径操作:
os.path.join(path, *paths)
: 将多个路径组合成一个路径。
import os
# 当前文件目录的绝对路径
now_path = os.getcwd()
res = os.path.join(now_path, 'test.py')
print(res)
# D:\Files\Python\pythonProject1\test.py
'''可以只传递一个参数,但失去了拼接路径的功能了就'''
res = os.path.join('test.py')
print(res)
# test.py
'''也可以拼接两个文件夹参数'''
res = os.path.join('1', 'test.py')
print(res)
# 1\test.py
os.path.abspath(path)
: 返回路径的绝对路径。
import os
res = os.path.join('1', 'test.py') # 1\test.py
abs_path = os.path.abspath(res)
print(abs_path)
# D:\Files\Python\pythonProject1\1\test.py
os.path.basename(path)
: 返回路径的基本名称。
import os
res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
base_name = os.path.basename(res)
print(base_name)
# 3.py
# 返回最后一层的文件名称
'''也可以是文件夹'''
import os
res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder')
base_name = os.path.basename(res)
print(base_name)
# folder
os.path.dirname(path)
: 返回路径的目录名称。
'''与basename刚好相反,返回的是最后一级目录之前的路径'''
import os
res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder')
dir_name = os.path.dirname(res)
print(dir_name)
# D:\Files\Python\pythonProject1\outer\inner
os.path.exists(path)
: 判断路径是否存在。
'''判断路径是否存在'''
import os
res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder')
is_exists = os.path.exists(res)
print(is_exists)
# False
# 文件夹folder我并没有创建,所以是False
os.mkdir(res) # 创建文件夹
is_exists = os.path.exists(res)
print(is_exists)
# True
os.path.isfile(path)
: 判断路径是否为文件。
import os
res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder')
is_exists = os.path.isfile(res)
print(is_exists)
# False
res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
is_exists = os.path.isfile(res)
print(is_exists)
# True
os.path.isdir(path)
: 判断路径是否为目录。
import os
res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder')
is_exists = os.path.isdir(res)
print(is_exists)
# True
res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
is_exists = os.path.isdir(res)
print(is_exists)
# False
【3】文件信息
os.path.getatime(path)
: 获取文件或目录的最后访问时间
- Access Time (atime): 表示文件或目录最后一次被访问的时间。即文件内容最后一次被读取的时间。在某些系统上,读取文件内容时,文件的 atime 会被更新
import os
import time
res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
atime = os.path.getatime(res)
# 时间戳格式
print(atime) # 1704192670.7195954
# 格式化时间戳
time_strf = time.strftime("%x %X", time.localtime(atime))
print(time_strf) # 01/02/24 18:51:10
os.path.getctime(path)
: 获取文件或者目录的创建时间
- Change Time (ctime): 表示文件或目录的状态发生变化的时间。这包括文件的元数据(比如权限)的修改,或者文件内容的变化。在某些系统上,文件内容发生变化时,文件的 ctime 会被更新。
import os
import time
res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
ctime = os.path.getctime(res)
# 时间戳格式
print(ctime) # 1704188099.065199
# 格式化时间戳
time_strf = time.strftime("%x %X", time.localtime(ctime))
print(time_strf) # 01/02/24 17:34:59
os.path.getmtime(path)
: 返回文件或路径的最后修改时间
- Modification Time (mtime): 表示文件内容最后一次被修改的时间。即文件的实际内容被修改的时间。在文件内容发生变化时,文件的 mtime 会被更新
import os
import time
res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
mtime = os.path.getmtime(res)
# 时间戳格式
print(mtime) # 1704192670.7195954
# 格式化时间戳
time_strf = time.strftime("%x %X", time.localtime(mtime))
print(time_strf) # 01/02/24 18:51:10
os.path.getsize(path)
: 返回文件的大小
import os
res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
file_size = os.path.getsize(res)
print(file_size)
# 25
os.stat(path)
: 获取文件夹/文件详细信息
import os
res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
file_stat = os.stat(res)
print(file_stat)
# os.stat_result(st_mode=33206, st_ino=1970324837048557, st_dev=**********, st_nlink=1, st_uid=0, st_gid=0,
# st_size=25, st_atime=1704192832, st_mtime=1704192787, st_ctime=1704188099)
- st_mode (文件的模式/权限): 包含文件的权限信息。可以使用
stat.S_ISDIR(mode)
、stat.S_ISREG(mode)
等函数来判断文件的类型。
- st_ino (inode 号): 包含文件的 inode 号,唯一标识文件在文件系统中的位置。
- st_dev (设备号): 包含文件所在设备的标识符。
- st_nlink (硬链接数): 包含文件的硬链接数。如果文件有多个硬链接,该数值大于 1。
- st_uid (用户 ID): 包含文件所有者的用户 ID。
- st_gid (组 ID): 包含文件所属组的组 ID。
- st_size (文件大小): 包含文件的大小,以字节为单位。
- st_atime (最后访问时间): 包含文件的最后访问时间。
- st_mtime (最后修改时间): 包含文件的最后修改时间。
- st_ctime (创建时间): 包含文件的创建时间。
【4】查看分隔符等
os.sep
: 用于表示操作系统路径中的路径分隔符的字符串
import os
print(os.sep) # \
path = "D:" + os.sep + "files" + os.sep + "000.py"
print(path) # D:\files\000.py
os.linesep
:用于表示当前操作系统的换行符。
import os
print(os.linesep)
path = "a" + os.linesep + "b"
print(path)
# a
# b
- Windows 上是
\r\n
- Unix/Linux 上是
\n
os.pathsep
:用于分隔文件路径的字符串
import os
print(os.pathsep) # ;
- 在 Unix/Linux 系统上,它通常是
':'
(冒号)
- 在 Windows 系统上,它通常是
';'
(分号)
os.name
:表示当前操作系统的名称
import os
print(os.name) # nt
'posix'
: 表示 Unix/Linux 系统。
'nt'
: 表示 Windows 系统。
'os2'
: 表示 OS/2 系统。
'ce'
: 表示 Windows CE 系统。
'java'
: 表示 Java 环境。
【5】执行系统命令
os.system(command)
: 运行shell命令
- command :"bash command" 由bash解释器执行的shell命令
import os
os.system("tasklist")
os.popen(command).read()
: 运行shell命令,获取执行结果
import os
task_list = os.popen("tasklist").read()
print(task_list)
print(type(task_list)) # <class 'str'>
- 可以通过变量接收值
os.system
只能执行,而os.popen().read()
可以接收值
【四】小练习
【0】__file__
:获取当前文件的绝对路径
【1】列举出指定文件夹下的所有文件
import os
# 根路径
BASE_DIR = os.path.dirname(__file__)
# 视频路径
media_path = os.path.join(BASE_DIR, 'media')
# 文件列表
file_list = os.listdir(media_path)
# 文件字典 索引作键,文件名作值
media_menu = {}
for index, value in enumerate(file_list):
media_menu[index + 1] = value
while True:
for k, v in media_menu.items():
print(f"{k} | {v}")
choice = input("请输入查看的文件编号:").strip()
if choice.isdigit():
choice = int(choice)
if choice not in media_menu.keys():
print("编号不存在!")
continue
else:
mp4_path = os.path.join(media_path, media_menu[choice])
with open(mp4_path, 'rb') as fp:
data = fp.read()
print(data)
else:
print("请输入编号!")
continue
'''
1 | media1.mp4
2 | media2.mp4
3 | media3.mp4
请输入查看的文件编号:1
b'' # 没有内容,所以此处为空
'''