[TOC] OS模塊 能與操作系統交互,控制文件 / 文件夾 | 方法 | 詳解 | | : : | : : | | os.getcwd() | 獲取當前工作目錄,即當前python腳本工作的目錄路徑 | | os.chdir("dirname") | 改變當前腳本工作目錄;相當於shell下cd ...
目錄
OS模塊
能與操作系統交互,控制文件 / 文件夾
# 創建文件夾
import os
os.mkdir(r'D:\py_case\test')
# 刪除文件夾
os.rmdir(r'D:\py_case\test')
# # 列出指定目錄下所有文件和子目錄 (子目錄文件不會列出來)
res = os.listdir(r'D:\pycharm_project\Test')
print(res)
# 列印結果:['.idea', 'ex16.py', 'test.json', 'test.pkl', 'test.py']
# 列出當前文件所在的文件夾
res = os.getcwd()
print(res)
# 列印結果: D:\pycharm_project\Test
# 列出當前文件所在的具體路徑
# __file__ pycharm獨有的
res = os.path.abspath(__file__) # 根據不同的操作系統更換不同的/或\
print(res) # D:\pycharm_project\Test\test.py
# 文件的文件夾
res = os.path.dirname(os.path.abspath(__file__))
print(res) # D:\pycharm_project\Test
res = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(res) # D:\pycharm_project
# 拼接文件路徑
res = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'img', 'test.jpg')
print(res) # D:\pycharm_project\Test\img\test.jpg
# 判斷路徑是否存在(文件 / 文件夾都適用)
res = os.path.exists(r'D:\pycharm_project\Test\ex16.py')
print(res) # True
# 判斷是否為文件
res = os.path.isfile(r'D:\pycharm_project\Test\aaa')
print(res) # False
# 刪除文件
os.remove('test.txt')
# 重命名文件
os.rename('test.txt', 'test2.txt')
# 判斷是否為文件夾
res = os.path.isdir(r'D:\pycharm_project\Test\aaa')
print(res) #True
# 與終端交互,輸入命令
res = os.system('dir')
print(res)
res = os.walk(r'D:\pycharm_project\Test\aaa')
print(res) # <generator object walk at 0x0000027DB46916D8>
res = os.walk(r'D:\pycharm_project\Test')
# print(res)
for dir, _, files in res:
# print(i) # 所有文件夾名
# print(l) # 某個文件下對應的所有文件名
for file in files:
file_path = os.path.join(dir,file) # 拼接成所有文件名
if file_path.endswith('py'): # 拿到py文件
print(file_path)
# 列印結果:
'''
D:\pycharm_project\Test\ex16.py
D:\pycharm_project\Test\test.py
D:\pycharm_project\Test\aaa\12.py
'''
方法 | 詳解 |
---|---|
os.getcwd() | 獲取當前工作目錄,即當前python腳本工作的目錄路徑 |
os.chdir("dirname") | 改變當前腳本工作目錄;相當於shell下cd |
os.curdir | 返回當前目錄: ('.') |
os.pardir | 獲取當前目錄的父目錄字元串名:('..') |
os.makedirs('dirname1/dirname2') | 可生成多層遞歸目錄 |
os.removedirs('dirname1') | 若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推 |
os.mkdir('dirname') | 生成單級目錄;相當於shell中mkdir dirname |
os.rmdir('dirname') | 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname |
os.listdir('dirname') | 列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式列印 |
os.remove() | 刪除一個文件 |
os.rename("oldname","newname") | 重命名文件/目錄 |
os.stat('path/filename') | 獲取文件/目錄信息 |
os.sep | 輸出操作系統特定的路徑分隔符,win下為"",Linux下為"/" |
os.linesep | 輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n" |
os.pathsep | 輸出用於分割文件路徑的字元串 win下為;,Linux下為: |
os.name | 輸出字元串指示當前使用平臺。win->'nt'; Linux->'posix' |
os.system("bash command") | 運行shell命令,直接顯示 |
os.environ | 獲取系統環境變數 |
os.path.abspath(path) | 返回path規範化的絕對路徑 |
os.path.split(path) | 將path分割成目錄和文件名二元組返回 |
os.path.dirname(path) | 返回path的目錄。其實就是os.path.split(path)的第一個元素 |
os.path.basename(path) | 返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素 |
os.path.exists(path) | 如果path存在,返回True;如果path不存在,返回False |
os.path.isabs(path) | 如果path是絕對路徑,返回True |
os.path.isfile(path) | 如果path是一個存在的文件,返回True。否則返回False |
os.path.isdir(path) | 如果path是一個存在的目錄,則返回True。否則返回False |
os.path.join(path1[, path2[, ...]]) | 將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略 |
os.path.getatime(path) | 返回path所指向的文件或者目錄的最後存取時間 |
os.path.getmtime(path) | 返回path所指向的文件或者目錄的最後修改時間 |
os.path.getsize(path) | 返回path的大小 |
sys模塊
與python解釋器交互
import sys
## 最常用,當使用命令行式運行文件,接收多餘的參數
res = sys.argv
print(res)
方法 | 詳解 |
---|---|
sys.argv | 命令行參數List,第一個元素是程式本身路徑 |
sys.modules.keys() | 返回所有已經導入的模塊列表 |
sys.exc_info() | 獲取當前正在處理的異常類,exc_type、exc_value、exc_traceback當前處理的異常詳細信息 |
sys.exit(n) | 退出程式,正常退出時exit(0) |
sys.hexversion | 獲取Python解釋程式的版本值,16進位格式如:0x020403F0 |
sys.version | 獲取Python解釋程式的版本信息 |
sys.maxint | 最大的Int值 |
sys.maxunicode | 最大的Unicode值 |
sys.modules | 返回系統導入的模塊欄位,key是模塊名,value是模塊 |
sys.path | 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變數的值 |
sys.platform | 返回操作系統平臺名稱 |
sys.stdout | 標準輸出 |
sys.stdin | 標準輸入 |
sys.stderr | 錯誤輸出 |
sys.exc_clear() | 用來清除當前線程所出現的當前的或最近的錯誤信息 |
sys.exec_prefix | 返回平臺獨立的python文件安裝的位置 |
sys.byteorder | 本地位元組規則的指示器,big-endian平臺的值是'big',little-endian平臺的值是'little' |
sys.copyright | 記錄python版權相關的東西 |
sys.api_version | 解釋器的C的API版本 |
json和pickle模塊
序列化和反序列化
- 序列化:按照特定的規則排列,把python數據類型轉化為json串,便於跨平臺傳輸
- 反序列化:把json串轉化為python / java / c / php 需要的語言
Json序列化並不是python獨有的,json序列化在java等語言中也會涉及到,因此使用json序列化能夠達到跨平臺傳輸數據的目的。
json數據類型和python數據類型對應關係表
Json類型 | Python類型 |
---|---|
{} | dict |
[] | list |
"string" | str |
520.13 | int或float |
true/false | True/False |
null | None |
json模塊
dic = {'a': 1, 'b': 2, 'c': None}
data = json.dumps(dic) # json串中沒有單引號
print(type(data), data)
data = json.loads(data)
print(type(data), data)
# 列印結果:
'''
<class 'str'> {"a": 1, "b": 2, "c": null}
<class 'dict'> {'a': 1, 'b': 2, 'c': None}
'''
dic = {'a': 1, 'b': 2, 'c': None}
# 序列化字典為json串,並保存文件
with open('test.json', 'w', encoding='utf-8') as fw:
json.dump(dic, fw)
# 反序列化
with open(f'{"test"}.json', 'r', encoding='utf-8') as fr:
data = json.load(fr)
print(type(data), data) # <class 'dict'> {'a': 1, 'b': 2, 'c': None}
pickle
Pickle序列化和所有其他編程語言特有的序列化問題一樣,它只能用於Python。但是pickle的好處是可以存儲Python中的所有的數據類型,包括對象,而json不可以。
import pickle
se = {1, 3, 4, 5, 6}
with open('test.pkl', 'wb') as fw:
pickle.dump(se, fw)
se = {1, 3, 4, 5, 6}
def func():
x = 3
def wrapper():
print(x)
return wrapper
with open('test.pkl', 'wb') as fw:
pickle.dump(func, fw)
with open('test.pkl', 'rb') as fr:
data = pickle.load(fr)
# print(data)
res = data()
res()
logging模塊
v1:
import logging
# 日誌級別(如果不設置,預設顯示30以上)
logging.info('info') # 10
logging.debug('debug') # 20
logging.warning('warning') # 30
logging.error('error') # 40
logging.critical('critical') # 50
# 列印結果:
'''
WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical
'''
v2:
import logging
# 日誌的基本配置
logging.basicConfig(filename='access.log',
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
level=10) # level是等級,10以上的都記錄日誌
logging.info('正常信息') # 10
logging.debug('調試信息') # 20
logging.warning('警告信息') # 30
logging.error('報錯信息') # 40
logging.critical('嚴重錯誤信息') # 50
# 會創建一個access.log日誌:
'''
2019-09-27 21:57:45 PM - root - DEBUG -test: 調試信息
2019-09-27 21:57:45 PM - root - INFO -test: 正常信息
2019-09-27 21:57:45 PM - root - WARNING -test: 警告信息
2019-09-27 21:57:45 PM - root - ERROR -test: 報錯信息
2019-09-27 21:57:45 PM - root - CRITICAL -test: 嚴重錯誤信息
'''
v3: 自定義配置
import logging
# 1. 配置logger對象
cwz_logger = logging.Logger('cwz')
neo_logger = logging.Logger('neo')
# 2. 配置格式
formmater1 = logging.Formatter('%(asctime)s - %(name)s -%(thread)d - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p ', )
formmater2 = logging.Formatter('%(asctime)s : %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p', )
formmater3 = logging.Formatter('%(name)s %(message)s', )
# 3. 配置handler --> 往文件列印or往終端列印
h1 = logging.FileHandler('cwz.log')
h2 = logging.FileHandler('neo.log')
sm = logging.StreamHandler()
# 4. 給handler配置格式
h1.setFormatter(formmater1)
h2.setFormatter(formmater2)
sm.setFormatter(formmater3)
# 5. 把handler綁定給logger對象
cwz_logger.addHandler(h1)
cwz_logger.addHandler(sm)
neo_logger.addHandler(h2)
# 6. 直接使用
cwz_logger.info(f'cwz 購買 變形金剛 8個')