標籤:設定檔 lse log __file__ 模板 byte odi strong AC
軟體開發目錄規範
路徑:用常量名,後面賦予路徑
常量路徑名=r‘路徑‘
常用目錄:(當前水平用這個目錄足夠了)
ATM:檔案夾,所需要做的項目名,用於存放項目相關所有檔案和檔案夾
readme:檔案,用於介紹程式功能
bin:檔案夾,只放開機檔案
start:檔案,開機檔案
conf:檔案夾,用於存放設定檔
settings:檔案名稱,設定檔
core:檔案夾,存放核心邏輯
src:檔案名稱,業務核心邏輯檔案
db:檔案夾,用於存放資料檔案
db:檔案名稱,用於存放資料
lib:檔案夾,用於存放常用工具,也就是模組檔案
common:檔案名稱,常用功能檔案,也就是常用模組檔案
log:檔案夾,用於存放檔案日誌
access.log:檔案名稱,記錄檔
應該把項目的根目錄添加到環境變數中;
就比如上方的ATM項目:
根目錄就是ATM目錄,以後需要調用什麼功能,在根目錄下都可以尋找到
取目錄:
os.path.dirname(__file__) :取當前檔案所在的目錄
os.path.dirname(os.path.dirname(__file__) ) :取當前所在在檔案目錄的上一級目錄
以此類推,取第幾層就寫幾段,後面有跟方便的方法,此方法僅供參考
然後把你需要的路徑,賦值到一個常量當中,當以後有需要調用的時候,直接調用常量名
不必輸入固定目錄,以限制程式
比如,sys.path.append(os.path.dirname(__file__) ):直接加入當前路徑
第二種方法:推薦
os.path.normpath(os.path.join(
__file__,
‘..‘,
‘..‘
))
logging模組
debug:代表調試資訊,層級10
info:代表正常運行資訊,層級20
warning:代表警告資訊,層級30
errot:代表錯誤資訊,層級40
critical:代表崩潰資訊,層級50
設定成什麼層級,列印什麼層級資訊
logging模組模板
"""
logging配置
"""
#定義記錄檔路徑
#把日誌路徑賦予一個變數
LOG_PATH=r‘a3.log‘
# 定義三種日誌輸出格式 開始
#把自己定義的個數賦予一個變數用於後面的調用
standard_format = ‘[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]‘ \
‘[%(levelname)s][%(message)s]‘ #其中name為getlogger指定的名字
simple_format = ‘[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s‘
id_simple_format = ‘[%(levelname)s][%(asctime)s] %(message)s‘
# log配置字典
LOGGING_DIC = {
‘version‘: 1,
‘disable_existing_loggers‘: False,
#多個日誌格式,不可更改
‘formatters‘: {
#日誌格式名,可更改,這名字的意思是往終端打
‘standard‘: {
#日誌格式:上方定義的格式的變數名
‘format‘: standard_format
},
#這個名字的意思是往檔案打
‘simple‘: {
‘format‘: simple_format
},
},
#過濾,沒什麼用,可以無視
‘filters‘: {},
#定義日誌輸出的格式:檔案或終端,不可更改
‘handlers‘: {
#列印到終端的日誌名,可以更改
‘console‘: {
#定義記錄層級,不可更改:記錄層級,可更改為DEBUG/INFO/WARNING/ERROT/CRITICAL
‘level‘: ‘DEBUG‘,
#定義日誌輸出格式,不可更改
‘class‘: ‘logging.StreamHandler‘, # 列印到螢幕
#綁定格式,不可更改:具體格式根據上方定義的格式更改
‘formatter‘: ‘simple‘
},
#列印到檔案的日誌,收集info及以上的日誌
‘default‘: {
‘level‘: ‘DEBUG‘,
‘class‘: ‘logging.handlers.RotatingFileHandler‘, # 儲存到檔案
‘formatter‘: ‘standard‘,
#日誌寫到哪個檔案:變數名,此變數我們在上面以賦予路徑
‘filename‘: LOG_PATH, # 記錄檔
#規定日誌切分大小,以位元組為單位
‘maxBytes‘: 1024*1024*5, # 日誌大小 5M
#規定日誌切分後儲存的日誌次數
‘backupCount‘: 5,
#記錄檔編碼
‘encoding‘: ‘utf-8‘, # 記錄檔的編碼,再也不用擔心中文log亂碼了
},
},
#產生日誌,並且傳的名字,名字空為預設
‘loggers‘: {
#logging.getLogger(__name__)拿到的logger配置
‘‘: {
#把日誌丟給誰,列表記憶體放的上上方定義的日誌名
‘handlers‘: [‘default‘, ‘console‘], # 這裡把上面定義的兩個handler都加上,即log資料既寫入檔案又列印到螢幕
#順位,兩層關卡,與上方層級相同即可
‘level‘: ‘DEBUG‘,
#向父級傳遞,通常關閉就可以了
‘propagate‘: False, # 向上(更高level的logger)傳遞
},
},
}
import logging
import logging.config
#載入上方定義的字典
def get_logger(name):
#讓logging模組從字典裡載入配置
logging.config.dictConfig(LOGGING_DIC) # 匯入上面定義的logging配置
#拿到logging名,因為上面logging名為空白,所以這裡用__name__,如果上方定義了實名,就用上方定義的實名
logger = logging.getLogger(name) # 產生一個log執行個體
return logger # 記錄該檔案的運行狀態
#用來測試是否在當前檔案執行
if __name__ == ‘__main__‘:
get_logger()
什麼是序列化:
我們把對象(變數)從記憶體中變成可儲存或可傳輸的過程叫做序列化;
為什麼要有序列化:
1.持久儲存狀態
2.跨平台資料互動
json模組
json只能處理字典,列表,字串,數字,bool,空類型
json內都是雙引號
序列化:記憶體中的資料結構——轉成一種中間格式(字串)——儲存到檔案中
關鍵字:json.dump()
用法:json.dump(需要序列化的值,開啟檔案的變數名)
還原序列化:檔案——讀取中間格式(字串)——轉成記憶體中的資料結構
只用W寫入模式
關鍵字:json.load
用法:json.load(開啟檔案的變數名)
pickle模組
pickle可以轉換所有的類型,但只能在python中使用
序列化:記憶體中的資料結構——轉成一種中間格式(字串)——儲存到檔案中
關鍵字:pickle.dump()
用法:pickle.dump(需要序列化的值,開啟檔案的變數名)
還原序列化:檔案——讀取中間格式(字串)——轉成記憶體中的資料結構
只用W寫入模式
關鍵字:pickle.load
用法:pickle.load(開啟檔案的變數名)
os模組
os.path.abspath(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.getsize(path)統計檔案大小,單位為位元組
os.path.join(‘a‘,‘b‘,‘c.txt‘) 將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略
不用寫路徑符
os.path.normpath(path) 正常化路徑,把裡面的斜杠同一,..(..返回上一層符號)執行等
用於取需要的絕對路徑:
Python之旅.第三章.函數4.04