軟件開發規範及常用模塊一
阿新 • • 發佈:2018-04-05
兩層 表達式 轉換 tac 報錯 blog lin 傳輸 元素
一、軟件開發規範
ATM #總文件夾
bin:用來放程序執行文件;start.py
conf:配置文件
log:日誌文件
lib:放模塊和包
db:數據文件
core:放程序的核心邏輯,裏面src.py
readme #用來保存詳細的每個文件夾的介紹,及作用
以上並未非規定,而是看個人理解不同自行定制。但一定要清晰明了。
二、序列化
前我們學習過用eval內置方法可以將一個字符串轉成python對象,不過,eval方法是有局限性的,對於普通的數據類型,json.loads和eval都能用,
但遇到特殊類型的時候,eval就不管用了,所以eval的重點還是通常用來執行一個字符串表達式,並返回表達式的值。
import json
x="[null,true,false,1]"
print(eval(x)) #報錯,無法解析null類型,而json就可以
print(json.loads(x))
什麽是序列化?
我們把對象(變量)從內存中變成可存儲或傳輸的過程稱之為序列化
序列化的主要目的:
1:持久保存狀態
2:跨平臺數據交互
序列化之後,不僅可以把序列化後的內容寫入磁盤,還可以通過網絡傳輸到別的機器上,如果收發的雙方約定好實用一
種序列化的格式,那麽便打破了平臺/語言差異化帶來的限制,實現了跨平臺數據交互。反過來,把變量內容從序列化的
對象重新讀到內存裏稱之為反序列化,即unpickling。
1. json
如果我們要在不同的編程語言之間傳遞對象,就必須把對象序列化為標準格式,比如XML,但更好的方法是序列化為JSON,
因為JSON表示出來就是一個字符串,可以被所有語言讀取,也可以方便地存儲到磁盤或者通過網絡傳輸。
JSON表示的對象就是標準的JavaScript語言的對象,JSON和Python內置的數據類型對應如下:
2. pickle
Pickle的問題和所有其他編程語言特有的序列化問題一樣,就是它只能用於Python 。因此使用較少,不過它可以支持python內
所有的數據類型。
三、logging模塊
logging模塊的四種對象:
1 logger:負責產生日誌
2 filter:過濾日誌(不常用)
3 handler:控制日誌打印到文件or終端
4 formatter:控制日誌的格式
四種對象具體使用方式(了解即可) :
logger:負責產生日誌
logger1=logging.getLogger(‘xxx‘)
filter:過濾日誌(不常用)
handler:控制日誌打印到文件or終端
fh1=logging.FileHandler(filename=‘a1.log‘,encoding=‘utf-8‘)
fh2=logging.FileHandler(filename=‘a2.log‘,encoding=‘utf-8‘)
sh=logging.StreamHandler()
formatter:控制日誌的格式
formatter1=logging.Formatter(
fmt=‘%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s‘,
datefmt=‘%Y-%m-%d %H:%M:%S %p‘,
)
formatter2=logging.Formatter(fmt=‘%(asctime)s - %(message)s‘,)
為logger1對象綁定handler
logger1.addHandler(fh1)
logger1.addHandler(fh2)
logger1.addHandler(sh)
為handler對象綁定日誌格式
fh1.setFormatter(formatter1)
fh2.setFormatter(formatter1)
sh.setFormatter(formatter2)
日誌級別: 兩層關卡,必須都通過,日誌才能正常記錄
logger1.setLevel(10)
fh1.setLevel(10)
fh2.setLevel(10)
sh.setLevel(10)
調用logger1對象下的方法,產生日誌,然後交給不同的handler,控制日誌記錄到不同的地方
logger1.debug(‘調試信息‘)
日常開發不需要自己寫日誌模塊,通常的做法是拿別人寫好的去使用,只需了解使用方法即可。
四、OS模塊
優先掌握
os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素(r‘C:\a\b\c\d.txt‘))
os.path.basename(path) 返回path最後的文件名。如何path以/或\結尾,那麽就會返回空值。(r‘C:\a\b\c\d.txt‘))
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False。只管路徑是否存在,不區分文件還是文件夾
print(os.path.exists(r‘D:\code\SH_fullstack_s1\day15\下午\json.py‘))
print(os.path.exists(r‘D:\code\SH_fullstack_s1\day15‘))
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False。
print(os.path.isfile(r‘D:\code\SH_fullstack_s1\day15\下午‘))
os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False
了解即可:
os.path.abspath(path) 返回path規範化的絕對路徑
file_path=r‘a\b\c\d.txt‘
print(os.path.abspath(file_path))
os.path.split(path) 將path分割成目錄和文件名二元組返回
res=os.path.split(r‘C:\a\b\c\d.txt‘)
print(res[-1])
print(res[0])
os.path.isabs(path) 如果path是絕對路徑,返回True
print(os.path.isabs(r‘b/c/d.txt‘))
os.path.normcase 在Windows上,文件系統上, 把路徑轉換為小寫字母,正斜杠轉換為反斜杠。
print(os.path.normcase(‘c:/windows\\system32\\‘) )
軟件開發規範及常用模塊一