python之模組(os、sys、json、subprocess)
os模組
os模組主要是與作業系統打交道。
匯入os模組
import os
建立單層資料夾,路徑必須要存在
os.mkdir(路徑/資料夾名)
"""不寫路徑就是在當前目錄建立資料夾"""
建立多層資料夾,路徑不存在會自動建立資料夾
os.makedirs(路徑/資料夾名/資料夾名...)
"""不寫路徑就是在當前目錄建立資料夾"""
刪除一層空的資料夾
os.rmdir(路徑/資料夾名)
"""不寫路徑就是在當前目錄刪除資料夾"""
刪除多層空資料夾,刪除一層資料夾後,如果上一級的資料夾是空的,會一直刪除上一級資料夾直到資料夾不為空
os.removedirs(路徑/資料夾名)
"""不寫路徑就是在當前目錄刪除資料夾"""
檢視某個路徑下所有的檔名稱
os.listdir(路徑)
"""不寫路徑就是在當前目錄"""
刪除檔案(無法刪除資料夾)
os.remove(檔名)
"""不寫路徑就是在當前目錄"""
重新命名檔案(無法重新命名資料夾)
os.rename(檔名,新檔名)
"""不寫路徑就是在當前目錄"""
返回當前路徑
os.getcwd()
改變當前路徑
os.chdir(路徑)
返回當前執行檔案所在的絕對路徑
os.path.dirname(__file__) # 固定搭配 # 每巢狀一層就會往上一層路徑 os.path.dirname(os.path.dirname(__file__))
返回當前執行檔案自身的路徑
os.path.abspath(__file__) # 固定搭配
判斷檔案是否存在(可以判斷資料夾和檔案)
os.path.exists(路徑)
判斷路徑是否是一個資料夾
os.path.isdir(路徑)
判斷路徑是否是一個檔案
os.path.isfile(路徑)
拼接成路徑
os.path.join(路徑1, 路徑2)
"""路徑2最好不要用絕對路徑"""
返回檔案大小(單位:位元組),如果路徑是資料夾,返回值為0
os.path.getsize(路徑)
判斷路徑是否是一個資料夾
os.path.isdir(路徑)
在cmd視窗執行括號內的命令,直接顯示
os.system(命令)
# 如
os.system('dir') # 獲取當前目錄資訊
在cmd視窗執行括號內的命令,獲取執行結果
os.popen(命令).read()
把執行檔案與所在路徑分開儲存在元組中
os.path.split(__file__) # 固定搭配
檔案時間問題
os.path.getatime(path) # 返回path所指向的檔案或者目錄的最後訪問時間
os.path.getmtime(path) # 返回path所指向的檔案或者目錄的最後修改時間
sys模組
sys模組主要是跟python直譯器打交道
匯入模組
import sys
以列表形式返回當前執行檔案所在的sys.path
sys.path
自定義命令列操作
sys.argv
"""
在cmd視窗中執行py檔案:python py檔案 命令1 命令2 ...
輸出:[py檔名, 命令1, 命令2, ...]
"""
sys.argv[0] # 返回py檔名
sys.argv[1] # 返回第一個命令
sys.argv[2] # 返回第二個命令
...
返回直譯器版本資訊
sys.version
獲取平臺資訊
sys.platform
正常退出程式後輸出內容
sys.exit(內容) # 程式正常退出才會輸出
json模組
json是什麼?
json是一個序列化模組,主要用於跨語言傳輸資料。json格式的資料是不同程式語言之間資料互動的媒介,基本上每個程式語言都能識別json格式的資料,識別的過程叫做反序列化。
json本質上是字串型別的,在python中,它的格式與字典極其相似。
字典的資料格式:
{'username':'abc','age':18}
json資料格式:
{"username": "abc", "age": 18}
可以看到,它們的區別就在引號上,雙引號是json格式資料獨有的標誌符號。
json模組
匯入
import json
序列化:將資料轉換成json格式字串
json.dumps(要序列化的資料)
# 案例
d = {'username': 'abc', 'age': 18}
res = json.dumps(d)
print(res, type(res))
# 輸出:{"username": "abc", "age": 18} <class 'str'>
反序列化:將json格式字串轉換成對應的資料型別
json.loads(要反序列化的資料)
# 案例
d = '{"username": "abc", "age": 18}'
res = json.loads(d)
print(res, type(res))
# 輸出:{'username': 'abc', 'age': 18} <class 'dict'>
將資料轉成json格式字串後寫入檔案
json.dump(要序列化的資料, 檔名)
# 案例
d = {"username": "abc", "age": 18} # json格式資料
with open(r'a.txt','w',encoding='utf8') as f:
json.dump(d, f)
將儲存json格式字串的檔案讀取後轉成對應的資料型別
json.load(檔名)
# 案例
with open(r'a.txt','r',encoding='utf8') as f:
print(json.load(f))
可以被序列化的資料型別可以檢視JSONEncoder的原始碼
subprocess模組
subprocess模組可以實現遠端操作其他計算機的功能,會在cmd視窗執行命令,動態獲取命令執行並返回結果。
匯入模組
import subprocess
run()方法
subprocess.run(args, *, stdin=None, input=None, stdout=None,
stderr=None, capture_output=False, shell=False, cwd=None,
timeout=None, check=False, encoding=None, errors=None,
text=None, env=None, universal_newlines=None)
來自菜鳥教程:
- args:shell命令,可以是字串或者序列型別(如:list,元組)
- bufsize:緩衝區大小。當建立標準流的管道物件時使用,預設-1。
0:不使用緩衝區
1:表示行緩衝,僅當universal_newlines=True時可用,也就是文字模式
正數:表示緩衝區大小
負數:表示使用系統預設的緩衝區大小。 - stdin, stdout, stderr:分別表示程式的標準輸入、輸出、錯誤控制代碼
- preexec_fn:只在 Unix 平臺下有效,用於指定一個可執行物件(callable object),它將在子程序執行之前被呼叫
- shell:如果該引數為 True,將通過作業系統的 shell 執行指定的命令。
- cwd:用於設定子程序的當前目錄。
- env:用於指定子程序的環境變數。如果 env = None,子程序的環境變數將從父程序中繼承。
Popen()方法
subprocess.Popen(args, bufsize=-1, executable=None, stdin=None,
stdout=None, stderr=None, preexec_fn=None, close_fds=True,
shell=False, cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0,restore_signals=True,
start_new_session=False, pass_fds=(),
*, encoding=None, errors=None)
# 執行ls命令
res = subprocess.Popen('ls',shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
# 獲取正確命令執行之後的結果
res.stdout.read().decode('utf8')
# 獲取錯誤命令執行之後的結果
res.stderr.read().decode('utf8')
來自菜鳥教程:
- args:shell命令,可以是字串或者序列型別(如:list,元組)
- bufsize:緩衝區大小。當建立標準流的管道物件時使用,預設-1。
0:不使用緩衝區
1:表示行緩衝,僅當universal_newlines=True時可用,也就是文字模式
正數:表示緩衝區大小
負數:表示使用系統預設的緩衝區大小。 - stdin, stdout, stderr:分別表示程式的標準輸入、輸出、錯誤控制代碼
- preexec_fn:只在 Unix 平臺下有效,用於指定一個可執行物件(callable object),它將在子程序執行之前被呼叫
- shell:如果該引數為 True,將通過作業系統的 shell 執行指定的命令。
- cwd:用於設定子程序的當前目錄。
- env:用於指定子程序的環境變數。如果 env = None,子程序的環境變數將從父程序中繼承。