1.time绘闷、datetime 時間模塊
2.random 隨機模塊
3.os 與操作系統(tǒng)交互的一個接口
4.sys 與python解釋器交互的一個接口
5.json 序列化模塊
6.hashlib 可以用來加密
7.re 正則匹配模塊
8.loggin 日志模塊
一、time和datetime模塊
time模塊有三種表現(xiàn)形式: 時間戳\格式化時間字符串\時間原則
#導入時間模塊
>>>import time
#時間戳
>>>time.time()
1500875844.800804
#時間字符串
>>>time.strftime("%Y-%m-%d %X")
'2017-07-24 13:54:37'
>>>time.strftime("%Y-%m-%d %H-%M-%S")
'2017-07-24 13-55-04'
#時間元組:localtime將一個時間戳轉(zhuǎn)換為當前時區(qū)的struct_time
time.localtime()
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24,
tm_hour=13, tm_min=59, tm_sec=37,
tm_wday=0, tm_yday=205, tm_isdst=0)
小結(jié):時間戳是計算機能夠識別的時間较坛;時間字符串是人能夠看懂的時間印蔗;元組則是用來操作時間的
時間格式的轉(zhuǎn)化
#時間戳-->結(jié)構(gòu)化時間
#time.gmtime(時間戳) #UTC時間,與英國倫敦當?shù)貢r間一致
#time.localtime(時間戳) #當?shù)貢r間丑勤。例如我們現(xiàn)在在北京執(zhí)行這個方法:與UTC時間相差8小時华嘹,UTC時間+8小時 = 北京時間
>>>time.gmtime(1500000000)
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=2, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
>>>time.localtime(1500000000)
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
#結(jié)構(gòu)化時間-->時間戳
#time.mktime(結(jié)構(gòu)化時間)
>>>time_tuple = time.localtime(1500000000)
>>>time.mktime(time_tuple)
1500000000.0
#結(jié)構(gòu)化時間-->字符串時間
#time.strftime("格式定義","結(jié)構(gòu)化時間") 結(jié)構(gòu)化時間參數(shù)若不傳,則現(xiàn)實當前時間
>>>time.strftime("%Y-%m-%d %X")
'2017-07-24 14:55:36'
>>>time.strftime("%Y-%m-%d",time.localtime(1500000000))
'2017-07-14'
#字符串時間-->結(jié)構(gòu)化時間
#time.strptime(時間字符串,字符串對應格式)
>>>time.strptime("2017-03-16","%Y-%m-%d")
time.struct_time(tm_year=2017, tm_mon=3, tm_mday=16, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=75, tm_isdst=-1)
>>>time.strptime("07/24/2017","%m/%d/%Y")
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=205, tm_isdst=-1)
其他用法
time.sleep(3) # 推遲3 秒
二法竞、random模塊
import random
#隨機小數(shù)
>>> random.random() # 大于0且小于1之間的小數(shù)
0.7664338663654585
>>> random.uniform(1,3) #大于1小于3的小數(shù)
1.6270147180533838
#隨機整數(shù)
>>> random.randint(1,5) # 大于等于1且小于等于5之間的整數(shù)
>>> random.randrange(1,10,2) # 大于等于1且小于10之間的奇數(shù)
#隨機選擇一個返回
>>> random.choice([1,'23',[4,5]]) # #1或者23或者[4,5]
#隨機選擇多個返回耙厚,返回的個數(shù)為函數(shù)的第二個參數(shù)
>>> random.sample([1,'23',[4,5]],2) # #列表元素任意2個組合
[[4, 5], '23']
#打亂列表順序
>>> item=[1,3,5,7,9]
>>> random.shuffle(item) # 打亂次序
>>> item
[5, 1, 3, 7, 9]
>>> random.shuffle(item)
>>> item
[5, 9, 7, 1, 3]
生成隨機驗證碼
# 手機版
import random
s = ''
for i in range(6):
num = str(random.randint(0,9)) # 0 - 9 之間的隨機整數(shù)轉(zhuǎn)化 str
s += num # 字符串拼接
print(s)
# 網(wǎng)頁版
import random
ret = ''
for i in range(6):
num = str(random.randint(0,9))
a_num = random.randint(97,122) # ascii : a - z
a_num2 = random.randint(65,90) # ascii : A - Z
apha = chr(a_num) # 將 ascii :數(shù)字轉(zhuǎn)化為字母
apha2 = chr(a_num2) # 將 ascii :數(shù)字轉(zhuǎn)化為字母
ret += random.choice([num,apha,apha2]) # 在數(shù)字小字母强挫,大字母,隨機選擇一個返回
# 然后將字符串拼接起來
print(ret)
三颜曾、OS模塊
這是一個與操作系統(tǒng)交互的接口
- 獲取和修改當前工作目錄
- 創(chuàng)建或刪除文件、文件夾
- 查看不同操作系統(tǒng)的一些符號
- 執(zhí)行操作系統(tǒng)的命令
-
跨平臺操作目錄
6.計算文件大小
圖1
圖2
圖3
四秉剑、sys模塊
五泛豪、json模塊
序列化模塊: 將原本的字典、列表等內(nèi)容轉(zhuǎn)化成一個字符串的過程就叫序列化侦鹏,
為什么序列化
1.要固態(tài)的儲存一個數(shù)據(jù)結(jié)構(gòu)
2.要在網(wǎng)絡(luò)上傳輸一個數(shù)據(jù)結(jié)構(gòu)
3.是程序更具有維護性
json提供了四個方法: dumps诡曙、dump、loads略水、load
字典价卤、列表、元祖(返回列表,因為他是被當做列表序列化的)
數(shù)據(jù)結(jié)構(gòu) ---> json dumps
json ---> 數(shù)據(jù)結(jié)構(gòu) loads
import json
dic = {"k":"v"} # 字典
print(dic,type(dic))
print(json.dumps(dic),type(json.dumps(dic)))
s = json.dumps(dic)
print(json.loads(s),type(json.loads(s)))
li = [1,2,3,4] # 列表
print(dic,type(li))
print(json.dumps(li),type(json.dumps(li)))
s = json.dumps(li)
print(json.loads(s),type(json.loads(s)))
li = [1,'asd',[1,2,3,4],{'name':'alex','age':56}] # 可以嵌套其他類型數(shù)據(jù)
print(json.dumps(li),type(json.dumps(li)))
s = json.dumps(li)
print(json.loads(s),type(json.loads(s)))
tu = (1,2,3,4) # 元組 返回列表
print(tu,type(tu))
print(json.dumps(tu),type(json.dumps(tu)))
s = json.dumps(tu)
print(json.loads(s),type(json.loads(s)))
# 元組和list 非常像渊涝,元組是作為一個list 被序列化的慎璧,所以轉(zhuǎn)回來以后只能轉(zhuǎn)成一個列表
文件的讀和寫
dic = {"k":"v"}
# 將字典寫入文件
with open('a1.txt','w')as f:json.dump(dic,f)
# 文件中的內(nèi)容:
{"k": "v"} # str
# 從文件中取讀字典
with open('a1.txt') as f1: print(json.load(f1))
{'k': 'v'}
六、hashlib模塊
1跨释、什么叫hash:hash是一種算法(這里代替了md5模塊和sha模塊胸私,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法)鳖谈,該算法接受傳入的內(nèi)容岁疼,經(jīng)過運算得到一串hash值
2、hash值的特點是:
1 只要傳入的內(nèi)容一樣缆娃,得到的hash值必然一樣=====>要用明文傳輸密碼文件完整性校驗
2 不能由hash值返解成內(nèi)容=======》把密碼做成hash值捷绒,不應該在網(wǎng)絡(luò)傳輸明文密碼
3 只要使用的hash算法不變,無論校驗的內(nèi)容有多大贯要,得到的hash值長度是固定的
import hashlib
m=hashlib.md5()# m=hashlib.sha256()
m.update('hello'.encode('utf8'))
print(m.hexdigest()) #5d41402abc4b2a76b9719d911017c592
m.update('alvin'.encode('utf8'))
print(m.hexdigest()) #92a7e713c30abbb0319fa07da2a5c4af
m2=hashlib.md5()
m2.update('helloalvin'.encode('utf8'))
print(m2.hexdigest()) #92a7e713c30abbb0319fa07da2a5c4af
'''
注意:把一段很長的數(shù)據(jù)update多次暖侨,與一次update這段長數(shù)據(jù),得到的結(jié)果一樣
但是update多次為校驗大文件提供了可能崇渗。
'''
以上加密算法雖然依然非常厲害它碎,但時候存在缺陷,即:通過撞庫可以反解显押。所以扳肛,有必要對加密算法中添加自定義key再來做加密。
hash = hashlib.sha256('898oaFs09f'.encode('utf8'))
hash.update('alvin'.encode('utf8'))
print (hash.hexdigest())#e79e68f070cdedcfe63eaf1a2e92c83b4cfb1b5c6bc452d214c1b7e77cdfd1c7
模擬撞庫
import hashlib
passwds=[
'alex3714',
'alex1313',
'alex94139413',
'alex123456',
'123456alex',
'a123lex',
]
def make_passwd_dic(passwds):
dic={}
for passwd in passwds:
m=hashlib.md5()
m.update(passwd.encode('utf-8'))
dic[passwd]=m.hexdigest()
return dic
def break_code(cryptograph,passwd_dic):
for k,v in passwd_dic.items():
if v == cryptograph:
print('密碼是===>\033[46m%s\033[0m' %k)
cryptograph='aee949757a2e698417463d47acac93df'
break_code(cryptograph,make_passwd_dic(passwds))
模擬撞庫破解密碼
七乘碑、re模塊
八挖息、loggin模塊
這是一個日志模塊
應用場景:
- 程序調(diào)試
- 了解軟件程序運行情況,是否正常
- 軟件程序運行故障分析與問題定位
但是在開發(fā)供別人使用的庫時,不推薦,因為會引起日志的混亂
import logging
logging.debug('debug message') # 程序里的調(diào)試消息兽肤。
logging.info('info message') # 獲取消息
logging.warning('warning message') # 報警信息
logging.error('error message') # 錯誤信息
logging.critical('critical message') # 臨界信息
從上到下 越來越嚴重
默認情況下Python的logging模塊將日志打印到了標準輸出中套腹,且只顯示了大于等于warning級別的日志绪抛,這說明默認的日志級別設(shè)置為warning(日志級別等級critical > error > warning > info > debug)
調(diào)用loggin
import logging
logger = logging.getLogger()
# 創(chuàng)建一個handler,用于寫入日志文件
fh = logging.FileHandler('test.log',encoding='utf-8')
# 再創(chuàng)建一個handler电禀,用于輸出到控制臺
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(fh) #logger對象可以添加多個fh和ch對象
logger.addHandler(ch)
logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')
在django項目中的應用
# 控制臺打印日志
BASE_LOG_DIR = os.path.join(BASE_DIR, "log") 注意要存在 log 文件夾用于記錄錯誤信息
LOGGING = {
'version': 1, #(版本) 保留的關(guān)鍵字幢码,暫時沒有用,以后可能有用
'disable_existing_loggers': False, #(禁用現(xiàn)有記錄器) 不禁用已經(jīng)存在的logger實例
'formatters': { # 定義的日志的格式
'standard': {
'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
'[%(levelname)s][%(message)s]'
},
'simple': {
'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
},
'collect': {
'format': '%(message)s'
}
}, # (格式程序)
'filters': {
'require_debug_true': { # 過濾日志的配置項
'()': 'django.utils.log.RequireDebugTrue',
},
}, # ( 過濾器 )
'handlers': {
'console': {
'level': 'DEBUG',
'filters': ['require_debug_true'], # 只有在Django debug為True時才在屏幕打印日志
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'SF': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件尖飞,根據(jù)文件大小自動切
'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 3, # 備份數(shù)為3 xx.log --> xx.log.1 --> xx.log.2 --> xx.log.3
'formatter': 'standard',
'encoding': 'utf-8',
},
# 'TF': {
# 'level': 'INFO',
# 'class': 'log.handlers.TimedRotatingFileHandler', # 保存到文件症副,根據(jù)時間自動切
# 'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件
# 'backupCount': 3, # 備份數(shù)為3 xx.log --> xx.log.2018-08-23_00-00-00 --> xx.log.2018-08-24_00-00-00 --> ...
# 'when': 'D', # 每天一切, 可選值有S/秒 M/分 H/小時 D/天 W0-W6/周(0=周一) midnight/如果沒指定時間就默認在午夜
# 'formatter': 'standard',
# 'encoding': 'utf-8',
# },
'default': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件政基,自動切
'filename': os.path.join(BASE_LOG_DIR, "bms_info.log"), # 日志文件
'maxBytes': 1024 * 1024 * 500, # 日志大小 500M
'backupCount': 3, # 最多保存多少個日志文件
'formatter': 'standard',
'encoding': 'utf-8', # 寫日志文件的編碼格式
},
'error': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件贞铣,自動切
'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"), # 日志文件
'maxBytes': 1024 * 1024 * 5, # 日志大小 50M
'backupCount': 5,
'formatter': 'standard',
'encoding': 'utf-8',
},
'collect': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動切
'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"),
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 5,
'formatter': 'collect',
'encoding': "utf-8"
}
}, # ( 處理程序 )
'loggers': {
'': { # 默認的logger應用如下配置
'handlers': ['SF', 'console', 'error'], # 上線之后可以把'console'移除
'level': 'DEBUG',
'propagate': True,
},
'collect': { # 名為 'collect'的logger還單獨處理
'handlers': ['console', 'collect'],
'level': 'INFO',
}
}, # ( 記錄器 )
}