今日內容:
1. random 模塊
2. json模塊
3. pickle 模塊
4.hashlib 模塊
5. hmac 模塊
6. shutil 模塊
7. shelve 模塊
?
?
1. random 模塊:
random 模塊 獲取隨機值
import random
for i in range(10):
print(random.random()) # random.random() 隨機獲取0~1 之間的數字,不包括0和1,
返回的是浮點型0.5319902943759903 0.9539062824026727
隨機獲取指定范圍內的整數值,比如1~10 范圍內的整數,包含起始位和結束位
for i in range(10):
print(random.randint(1,10))
隨機獲取指定范圍內的整數,比如1~10 范圍內的整數,不包含結束位置
for i in range(10):
print(random.randrange(1,10))
隨機獲取指定范圍內的浮點數,比如1~10 范圍內的浮點數,返回類型4.793951896180604
for i in range(10):
print(random.uniform(1,10))
random.choice 在item中取值,可以重復,取指定的range('次數')
item = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
for i in range(10):
print(random.choice(item),end='')
如果不使用for循環,每次取一個
item = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(random.choice(item),end='')
random.sample 在item中隨機取值,根據傳入的數字決定每次取值的個數(此處為每次取4個),range('次數')內放取值的次數
item = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
for i in range(10):
print(random.sample(item,4))
打亂 將item列表打亂
item = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
random.shuffle(item)
print(item)
驗證碼功能
方法1:
使用chr找到數字所對應的ascii碼表中的字母
def random_code(num): # 傳入驗證碼的位數
code = ""
for i in range(num): # 循環五次,取5 次值,然后隨機再下列三個條件中選擇一個。
d = random.randint(65, 90) # 隨機取值后,再在ascii碼表中大寫字母的位置
x = random.randint(97, 122) # 隨機取值后,再在ascii碼表中小寫字母的位置
n = random.randint(0, 9) # 數字是原意字符,直接轉str就行
code += random.choice([chr(d), chr(x), str(n)]) # 此處做字符串拼接
return code
res = random_code(5)
print(res)
方法2:
def random_code(num):
code = ""
for i in range(num): # 進入for循環后會隨機在1~3之間取值,然后找到相對應的條件,再取值
choose = random.randint(1,3)
if choose == 1:
c = chr(random.randint(65,90)) # 隨機取到值后找到對應的acsii碼表中的字符
elif choose == 2:
c = chr(random.randint(97,122)) # 隨機取到值后找到對應的acsii碼表中的字符
else:
c = str(random.randint(0,9)) # 原義字符,直接轉成str做字符串拼接用
code += c # 此處做字符串拼接。
return code
res = random_code(6)
print(res)
方法3
此方法有投機取巧的嫌疑。。。
def random_code(num):
target = '1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm' # 把所有字母數字做成一個字符串
code_list = random.sample(target, num) # 然后隨機抽取指定個數的字符。
return ''.join(code_list) # 然后使用 .join() 的方法拼接
res = random_code(5)
print(res)
2. json模塊
json模塊
import json
json語言,就是一種有語法規范的字符串,用來存放數據的,完成各種語言之間的數據交互
1.只能使用{}與[]的組合,{}存放雙列信息(與python中的字典類似),而[]存放單列信息(與python中的列表類似)
2.{}中的key必須是字符串,而且必須使用" " 來包裹
3.{} 與 [] 中支持的值的類型:dict ,list , int , float, bool ,null(類比python中的None), str
案例:
json_str = '{"info":1,"msg":[1,"a",true,false,null,3.14]}'
obj = json.loads(json_str) # json.loads 反序列化,可以把字符串類型轉換成它本身的類型
print(obj, type(obj)) # type()后此處obj的類型就變成了dict類型
序列化: 將對象轉換成字符串
dumps :只做將對象直接序列化成字符串的工作
dump: 不止做將對象序列化成字符串,還做write()功能,將序列化之后的字符串存儲到文件中
obj = {'name': 'owen', "age": 18, 'height': 180, "gender": "男"} # 此處對象為字典類型dict
# r1 = json.dumps(obj, ensure_ascii=False) # 然后使用dumps() 序列化為字符串,并取消默認ascii編碼,
# print(r1)
# 同該文件的編碼(utf-8),python3中默認,python2中需要規定文件頭coding:utf-8
with open('1.txt','w',encoding='utf-8') as wf: # 然后通過'w'模式打開文件
json.dump(obj,wf,ensure_ascii=False) # 通過dump()方法來寫入文件.(此處dump會把對象序列化并 做write() 的功能,來寫入文件中)
反序列化
loads :只做將字符串直接反序列化成對象的工作
load: 不止做將字符串序列化成對象,還做reda()功能,將反序列化之后的字符串讀取出來
json_str = '{"name":"owen","age":18,"height":180,"gender":"男"}'
r2 = json.loads(json_str,encoding = 'utf-8') # loads() 將字符串轉換為它本身的類型,默認與當前文件的解釋器編碼一致
print(r2,type(r2))
with open('1.txt','r',encoding='utf-8')as rf:
r3 = json.load(rf)
print(r3,type(r3))
?
3. pickle 模塊
pickle 模塊
為什么有很多序列化和反序列模塊
因為程序會出現各種各樣的對象,如果要將這些對象持久化存儲,必須先序列化
只有序列化存儲后,必須有對應的反序列化,才能保證你存儲數據能夠內重新讀取使用
什么是序列化?:將對象-->轉換成字符串
為什么要序列化?:用來存儲再次使用或者傳遞給別人使用
為什么有很多序列化模塊?:存與取的算法可以多種多樣,且要配套
pickle序列化做的是直接轉成了二進制,那么pickle的功能比json要廣泛,因為json只能序列化文本文件,而pickle全部類型的文件都可以序列化
import pickle
obj = {"name": "Owen", "age": 18, "height": 180, "gender": "男"}
序列化 dumps()
r1 = pickle.dumps(obj)
print(r1) # 此處返回的是二進制
序列化存儲dump()
with open('2.txt','wb')as wf:
pickle.dump(obj,wf)
反序列化
with open('2.txt', 'rb') as rf:
data = rf.read()
ol = pickle.loads(data)
print(ol, type(ol))
序列化讀取load()
with open('2.txt','rb') as rf:
ol = pickle.load(rf)
print(ol,type(ol))
4.hashlib 模塊
hashlib模塊
不可逆加密:沒有解密的加密方式 md5
解密方式:碰撞解密
加密的對象:用于傳輸的數據(字符串類型的數據)
import hashlib
lock = hashlib.md5()
data = '變有錢'
lock.update(data.encode('utf-8')) # 此處聲明utf-8是為了告訴hashlib,此處是以utf-8編碼的漢字
res = lock.hexdigest() # 此處是將加密后的數據以16進制的格式打印出來
print(res) # 輸入結果6bc477bd73049f77b5946f7c18449e65
如果是普通的字母或者數字,可以在字符串前加 b 來聲明
data = b'qweasdzxc123'
lock.update(data)
res = lock.hexdigest()
print(res)
一次加密:
1. 獲取加密對象,hashlib.md5() --> lock_obj
2. 添加加密數據,lock_obj.update(b'...')...lock_obj.update(b'...')
3. 獲取加密結果 lock.hexdigest()-->result
lock = hashlib.md5()
lock.update(b'')
res = lock.hexdigest()
print(res)
特點:加密的總數居一樣,加密結果一樣,且算法不變,加密結果長度不變
加鹽加密
1. 保證原數據過于簡單,通過復雜的鹽也可以提高解密難度
2. 即使被碰撞解密成功,也不能直接識別鹽與有效數據具體的組成
lock_obj = hashlib.md5()
lock_obj.update(b'goodgoodstudy') # 前鹽
lock_obj.update(b'123') # 有效數據
lock_obj.update(b'daydayup') # 后鹽
res = lock_obj.hexdigest()
print(res)
還有一些其他的加密方式
lock_obj = hashlib.sha3_256()
lock_obj = hashlib.sha3_512()
使用情況很少,不一一介紹
5. hmac 模塊
import hmac
使用方法
hmac.new(arg) # 必須提供一個參數
cipher = hmac.new('加密的數據'.encode('utf-8'))
print(cipher.hexdigest())
加前鹽
cipher = hmac.new('前鹽'.encode('utf-8'))
cipher.update('加密的數據'.encode('utf-8'))
print(cipher.hexdigest())
加后鹽
cipher = hmac.new('加密的數據'.encode('utf-8'))
cipher.update('后鹽'.encode('utf-8'))
print(cipher.hexdigest())
加前后鹽
cipher = hmac.new('前鹽'.encode('utf-8'))
cipher.update('加密的數據'.encode('utf-8'))
cipher.update('后鹽'.encode('utf-8'))
print(cipher.hexdigest())
6. shutil 模塊
shutil 模塊 #高級的 文件、文件夾、壓縮包 處理模塊
import shutil
基于路徑的文件復制: shutil.copyfile(a(文件路徑),b(新路徑))
shutil.copyfile(r'D:\python練習\python十萬行代碼\學day19\2.txt', r'D:\python練習\python十萬行代碼\學day19\a\b.txt')
基于流(二進制)的文件賦值 # with open('目標文件',rb)as r,open('新文件','wb')as w:
with open('day19博客.py','rb') as r,open('target_file.py','wb')as w:
shutil.copyfileobj(r,w)
遞歸刪除目標目錄 # 必須傳入絕對路徑,或者是當前目錄下的文件夾或者文件
shutil.rmtree(r'D:\python練習\python十萬行代碼\學day18\a')
文件移動 shutil.move('文件名','新路徑+新文件名')
shutil.move('target_file.py', 'part1/new_file.py')
文件夾壓縮
file_name:被壓縮后形成的文件名
format: 壓縮的格式
archive_path:要被壓縮的文件夾路徑
shutil.make_archive('file_name','format','archive_path')
案例:
shutil.make_archive('abc/my','zip','part1')
文件夾解壓
unpack_file: 被解壓文件 unpack_name: 解壓后的名字 format: 解壓格式
shutil.unpack_archive('unpack_file','unpack_name','format')
案例:
shutil.unpack_archive('abc/my.zip','abc/part2','zip')
?
7. shelve 模塊
shelve模塊 : 即時存取的序列化模塊
import shelve
shv_dic = shelve.open('my.shv')
shv_dic['name'] = 'Owen'
shv_dic['name'] = 'Zero'
shv_dic.close()
shv_dic = shelve.open('my.shv')
print(shv_dic['name'])
stus = ['張三', '漲姿勢']
shv_dic['stus'] = stus
print(shv_dic['stus'])
shv_dic.close()
shv_dic = shelve.open('my.shv', writeback=True)
# 將內容從文件中取出,在內存中添加, 如果操作文件有writeback=True,會將內存操作記錄實時同步到文件
shv_dic['stus'].append('裝13')
print(shv_dic['stus'])
shv_dic.close()
?