Python反射、模組中的變數os、sys、__file__、加密模組等
阿新 • • 發佈:2019-02-19
1、反射
輸入請求,呼叫請求的呼叫函式,使字串“func”變為func()。利用字串的形式去物件(預設)中操作成員(尋找、檢查、刪除、設定)。
commons:
#_*_coding:utf-8_*_
__author__ = 'Alex_XT'
def login():
print("login...")
def home():
print("home...")
def logout():
print("logout....")
main:
#_*_coding:utf-8_*_
__author__ = 'Alex_XT'
import commons
def run():
inp=input("請輸入命令:")
# 判斷是否存在該成員
if hasattr(commons,inp):
func=getattr(commons,inp)
func()
else:
print("404")
if __name__ == '__main__':
run()
2、利用字串匯入模組
#_*_coding:utf-8_*_
__author__ = 'Alex_XT'
def run():
inp=input("請輸入模組與命令:樣例》》commons/login" )
m,f=inp.split('/')
obj=__import__(m)
# 判斷是否存在該成員
if hasattr(obj,f):
func=getattr(obj,f)
func()
else:
print("404")
if __name__ == '__main__':
run()
如果不在同一資料夾下時,調用出錯,如將commons放到lib裡,改進為:
obj=__import__("lib."+m,fromlist=True)
3、模組中的_ doc_
對應開頭的定義:
"""
__author__ = 'Alex_XT'
"""
print(__doc__)
列印輸出檔案開頭的解釋
4、模組_ file_和os模組
列印當前執行檔案所在的路徑:print(__file__)
獲取當前執行檔案所在的路徑,獲得相對路徑。
import os
print(__file__)#command執行只拿到檔名
print(os.path.abspath(__file__))#拿到絕對路徑的完整路徑
print(os.path.dirname(os.path.abspath(__file__)))#拿到絕對路徑的上級路徑
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#拿到絕對路徑的上上級路徑
路徑的拼接:os.path.join()
用於提供系統級別的操作:
os.getcwd() 獲取當前工作目錄,即當前python指令碼工作的目錄路徑
os.chdir("dirname") 改變當前指令碼工作目錄;相當於shell下cd
os.curdir 返回當前目錄: ('.')
os.pardir 獲取當前目錄的父目錄字串名:('..')
os.makedirs('dir1/dir2') 可生成多層遞迴目錄
os.removedirs('dirname1') 若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推
os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname
os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
os.listdir('dirname') 列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印
os.remove() 刪除一個檔案
os.rename("oldname","new") 重新命名檔案/目錄
os.stat('path/filename') 獲取檔案/目錄資訊
os.sep 作業系統特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep 當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
os.pathsep 用於分割檔案路徑的字串
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所指向的檔案或者目錄的最後修改時間
5、新增路徑sys模組
檔案:
import os
import sys
print(__file__)#command執行只拿到檔名
print(os.path.abspath(__file__))#拿到絕對路徑的完整路徑
print(os.path.dirname(os.path.abspath(__file__)))#拿到絕對路徑的上級路徑
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#拿到絕對路徑的上上級路徑
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
進度條:
# _*_coding:utf-8_*_
"""
__author__ = 'Alex_XT'
"""
import sys
import time
def viewBar(num,total):
rate=num/total
int_number=int(rate*100)
sys.stdout.write("\r%s>%d%%"%("#"*num,int_number))#\r表示重新回到當前行的位置
sys.stdout.flush()
if __name__ == '__main__':
for i in range(0,11):
time.sleep(0.2)
viewBar(i,10)
結果:##########>100%
6、_ package_模組
所在的包檔名
from TEST.lib import commons
print(__package__)
print(commons.__package__)
7、_ name_模組
只有當執行當前檔案時,才是main函式,當其被匯入時,就不是main函數了。
if __name__ == '__main__':
run()
8、加密模組
hashlib:
用於加密相關的操作,代替了md5模組和sha模組,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 演算法
以上加密演算法雖然依然非常厲害,但時候存在缺陷,即:通過撞庫可以反解。所以,有必要對加密演算法中新增自定義key再來做加密。雙重加密:
import hashlib
obj=hashlib.md5(bytes('key',encoding='utf-8'))
obj.update(bytes("12345",encoding='utf-8'))
ret=obj.hexdigest()
print(ret)
######## sha1 ########
hash = hashlib.sha1()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())
# ######## sha256 ########
hash = hashlib.sha256()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())
# ######## sha384 ########
hash = hashlib.sha384()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())
# ######## sha512 ########
hash = hashlib.sha512()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())