一、os介绍
os模块主要是对操作执行执行操作,导入方法:import os
二、os.path模块的基本操作
1. 绝对路径
- os.path.abspath(path)
返回path的绝对路径
# 获取当前工作环境的绝对路径,不包括文件名
cur_path = os.path.abspath('.')
print(cur_path) # 结果 F:\PythonWorkSpace\PythonStudy\moduleStudy
# 获取当前工作环境的绝对路径,包括文件名
cur_file_path = os.path.abspath(__file__)
print(cur_file_path) # 结果:F:\PythonWorkSpace\PythonStudy\moduleStudy\os_operate.py
# 获取当前工作环境上一级的绝对路径
pre_path = os.path.abspath("..")
print(pre_path) # 结果 F:\PythonWorkSpace\PythonStudy
# 获取绝对路径的绝对路径
path = r'C:\Users\admin'
result = os.path.abspath(path)
print(result) # 结果 C:\Users\admin
# 获取相对路径的绝对路径
path = './test'
result = os.path.abspath(path)
print(result) # 结果F:\PythonWorkSpace\PythonStudy\moduleStudy\test
2. 获取路径的文件名、文件的路径
- os.path.basename(path)
返回路径的文件名 - os.path.dirname(path)
返回文件的路径
path = r'F:\PythonWorkSpace\PythonStudy\moduleStudy'
file_name = os.path.basename(path)
print(file_name) # 结果 moduleStudy
file_path = os.path.dirname(path)
print(file_path) # 结果 F:\PythonWorkSpace\PythonStudy
path = r"F:\PythonWorkSpace\PythonStudy\moduleStudy\os_operate.py"
file_name = os.path.basename(path)
print(file_name) # 结果 os_operate.py
file_path = os.path.dirname(path)
print(file_path) # 结果 F:\PythonWorkSpace\PythonStudy\moduleStudy
3.判断路径是否存在
- os.path.exists(path)
若path存在返回True
若path不存在返回False
path = r'F:\PythonWorkSpace\PythonStudy'
isExist = os.path.exists(path)
print(isExist) # 结果 True
path = r'F:\PythonWorkSpace\PythonStudy11'
isExist = os.path.exists(path)
print(isExist) # 结果 False
4.转化path中的"~" 和 "~user"为用户目录
- os.path.expanduser(path)
返回路径
path = "~"
result = os.path.expanduser(path)
print(result) # 结果 C:\Users\admin
5. 判断路径是否为文件、文件夹
- os.path.isfile(path)
若是文件,返回True;若不是文件,返回False - os.path.isdir(path)
若是文件夹,返回True;若不是文件夹,返回False
path = r"F:\PythonWorkSpace\PythonStudy\moduleStudy\os_operate.py"
isfile = os.path.isfile(path)
print(isfile) # 结果 True
isdir = os.path.isdir(path)
print(isdir) # 结果 False
path = r'F:\PythonWorkSpace\PythonStudy\moduleStudy'
isfile = os.path.isfile(path)
print(isfile) # 结果 False
isdir = os.path.isdir(path)
print(isdir) # 结果 True
6.获取文件的时间
- os.path.getmtime(file)
返回文件的修改时间 - os.path.getctime(file)
返回文件的创建时间
file = r"F:\PythonWorkSpace\PythonStudy\moduleStudy\os_operate.py"
amend_time = os.path.getmtime(path)
print(amend_time) # 结果 1547634893.3910005
create_time = os.path.getctime(file)
print(create_time) # 结果 1547623358.1830003
7.获取文件的大小
- os.path.getsize(file)
若file存在,则返回文件的大小,单位为字节;
若file不存在,报错FileNotFoundError
result = os.path.getsize(file)
print(result) # 结果 2921
8.合并目录与文件名为路径
- os.path.join(path [, name1, name2...])
在path后追加name1、name2...,组成新路径
path = r"F:\PythonWorkSpace"
file1 = 'PythonStudy'
file_path = os.path.join(path, file1)
print(file_path) # 结果 F:\PythonWorkSpace\PythonStudy
file2 = 'moduleStudy'
file_path = os.path.join(path, file1, file2)
print(file_path) # 结果 F:\PythonWorkSpace\PythonStudy\moduleStudy
9.分割路径
- os.path.split(path)
将路径分割成dirname和basename,返回元组类型 - os.path.splitext(path)
将路径分割成“文件后缀”和“文件路径+文件名”,返回元组类型
path = r'F:\PythonWorkSpace\PythonStudy\moduleStudy'
result = os.path.split(path)
print(result) # 结果 ('F:\\PythonWorkSpace\\PythonStudy', 'moduleStudy')
result = os.path.splitext(path)
print(result) # 结果 ('F:\\PythonWorkSpace\\PythonStudy\\moduleStudy', '')
path = r'F:\PythonWorkSpace\PythonStudy\moduleStudy\os_operate.py'
result = os.path.split(path)
print(result) # 结果 ('F:\\PythonWorkSpace\\PythonStudy\\moduleStudy', 'os_operate.py')
result = os.path.splitext(path)
print(result) # 结果 ('F:\\PythonWorkSpace\\PythonStudy\\moduleStudy\\os_operate', '.py')
path = r'F:\PythonWorkSpace\PythonStudy\moduleStudy'
三、os模块的基本操作
1. 获取当前工作目录
- os.getcwd()
返回当前工作路径
cur_path = os.getcwd()
print(cur_path) # 结果 F:\PythonWorkSpace\PythonStudy\moduleStudy
2.获取指定路径下的所有文件名
- os.listdir(path)
以列表形式返回path路径下的所有文件或文件夹的名称
file_names = os.listdir(cur_path)
print(file_names) # 结果 ['configparser_operate.py', 'os_operate.py', 'test', '__init__.py']
Eg:获取某个路径下的最新文件
# 获取path路径下的最新文件
def get_new_file(path):
dir_list = os.listdir(path)
dir_list.sort(key=lambda fn: os.path.getmtime(path + '\\' + fn))
new_file = os.path.join(path, dir_list[-1])
return new_file
print(get_new_file(path=cur_path))
3. 创建一个文件夹和多层文件夹
- os.mkdir(path[, mode])
path:创建一个名为path的目录
mode:非必填项,目录的权限,默认为0o777
若目录不存在,则新建目录;若目录存在,则报错 - os.makedirs(path[, mode])
path:递归创建目录(多层级文件夹一次创建)
若目录不存在,则新建目录;若目录存在,则报错
folder_path = r'D:/test'
if not os.path.exists(folder_path):
os.mkdir(folder_path)
folder_path = r'D:/first/second'
if not os.path.exists(folder_path):
os.makedirs(folder_path)
4.删除空目录和多层空目录
- os.rmdir(path)
若path目录为空目录,则删除此目录
若path目录不为空,则报错 - os.removedirs(path)
若path目录为空目录,则删除此目录
若path目录不为空,则报错
# 删除空文件夹
folder_path = r'D:/test'
if not os.listdir(folder_path):
os.rmdir(folder_path)
# 递归删除空文件夹
folder_path = r'D:/first/second'
if not os.listdir(folder_path):
os.removedirs(folder_path)
5.删除一个文件
- os.remove(path)
若path为文件且存在,则执行删除操作;
若path为目录,则报错
file_path = r'D:/test/1.txt'
if os.path.exists(file_path):
if os.path.isfile(file_path):
os.remove(file_path)
6.重命名文件或文件夹
- os.rename(src, dst)
将目标文件或文件夹src重命名dst - os.renames(old, new)
递归重命名文件或文件夹old为new
src = r'D:/test'
dst = r'D:/tests'
if os.path.exists(src):
os.rename(src, dst)
src = r'D:/tests/2.txt'
dst = r'D:/tests/555.txt'
if os.path.exists(src):
os.rename(src, dst)
# 递归重命名文件
old = r'D:/tests/3.txt'
new = r'D:/tests/a/1.txt'
if os.path.exists(old):
os.renames(old, new)
old = r'D:/tests/a'
new = r'D:/tests/b'
if os.path.exists(old):
os.renames(old, new)
7. 获取系统环境变量
- os.environ
# 获取系统所有环境变量
environment = os.environ
print(environment) # 结果 environ({'ANDROID': XXX, 'ANDROID_HOME': XXX, 'PATH': XXX, ....})
# 获取"ANDROID"的环境变量信息
print(environment['ANDROID']) # 结果 C:\Users\admin\AppData\Local\Android\Sdk\platform-tools
Eg:设置系统环境变量
# 设置系统环境变量
path_result = os.environ['PATH']
add_path = 'D:\\first'
if path_result[-1] == ';':
os.environ['PATH'] += add_path
else:
os.environ['PATH'] += ";" + add_path
8. 打开PC端某个文件或文件夹
- os.startfile(path)
path = r"C:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe"
os.startfile(path)
path = r"C:\Program Files (x86)\Tencent\QQ\Bin"
os.startfile(path)
9.遍历目录
- walk(top, topdown=True, onerror=None, followlinks=False)
- top:遍历的顶级目录的路径
top目录下返回一个三元组(dirpath, dirnames, filenames)
dirpath:字符串类型,当前正在遍历的文件夹的地址;
dirnames:列表类型,dirpath目录下所有目录的名称(不包括子目录);
filenames:列表类型,dirpath目录下所有的文件(不包括子目录);- topdown:默认为True
topdown为True表示先遍历top目录,再遍历top的子目录;
topdown为False表示先遍历top的子目录,再遍历top目录;- onerror:默认为None
onerror为None表示忽略文件遍历时的错误;
onerror不为None则提供一个自定义函数提示错误信息后继续遍历或抛出异常中止遍历;- followlinks:默认为False
followlinks为False表示优先遍历top的子目录;
followlinks为True表示遍历目录下的快捷方式
def walk_operate(path):
for dirpath, dirnames, filenames in os.walk(path):
print(dirpath, dirnames, filenames)
top_path = 'D:\\tests'
walk_operate(top_path)
"""结果
D:\tests ['1', '2'] []
D:\tests\1 [] ['1.txt', '2.txt']
D:\tests\2 ['2.1'] ['1.txt']
D:\tests\2\2.1 [] []
"""
#表示tests目录下有两个文件夹1和2
# 子目录1下有两个文件1.txt和2.txt,无文件夹
# 子目录2下有一个文件夹2.1,一个文件1.txt
# 子目录2下的子目录2.1下无文件夹和文件
10. 执行系统命令os.system
- os.system(command)
在当前进程中打开一个子进程来执行系统shell命令command;
仅会输出命令执行状态码,而将命令执行结果输出到屏幕上,故执行无法获取command命令执行后的输出内容。
若执行成功则返回状态码0;若执行失败则返回状态码1;
11.执行系统命令os.popen
- os.popen(command[, mode, bufsize])
打开一个管道,返回结果是一个连接管道的文件对象;
通过对文件对象来获取command命令执行后的输出内容,但无法获取命令执行状态码。
command:系统shell命令;
mode:非必写项,模式权限('r'和'w'),默认为'r';
bufsize:非必写项,表示文件需要的缓冲大小,0表示无缓冲,1表示行缓冲,-1表示使用系统默认值(默认为-1);
# 执行系统命令
cmd = "adb devices"
run_result = os.system(cmd)
print("sys_result:", run_result)
run_result = os.popen(cmd)
popen_result = run_result.readlines()
print("popen_result:", popen_result)
run_result.close()
run_result = os.popen(cmd)
popen_result = run_result.read()
print("popen_result:\n", popen_result)
run_result.close()
'''结果
sys_result: 0
popen_result: ['List of devices attached \n', '106D111805005938\tdevice\n', '\n']
popen_result:
List of devices attached
106D111805005938 device
'''
Eg1:获取所有连接PC的手机device_name
def get_devices():
"""
获取所连devices信息
:return: 若device存在,则以列表形式返回;若device不存在,则返回None
"""
cmd = "adb devices"
f = os.popen(cmd)
result = f.readlines()
f.close()
devices = []
for temp in result:
if '\tdevice' in temp:
device_name = temp.split('\tdevice')[0]
devices.append(device_name)
if len(devices) > 0:
return devices
else:
return None
get_devices()
Eg2:执行系统多条命令:命令之间通过&&关联
# 执行多条命令
# 由于仅是执行系统命令,无需返回结果,故os.system()或os.popen()方式均可
cmd1 = "E:"
cmd2 = "cd demo"
cmd3 = "mkdir test"
cmd = "%s && %s && %s" % (cmd1, cmd2, cmd3)
os.system(cmd)
# os.popen(cmd)