一、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)