python第十九天(random、json、pickle、hashlib、hmac、shutil、shevle模塊)

今日內容:

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()

?

轉載于:https://www.cnblogs.com/liguodeboke/p/10835615.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248982.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NodeJS入門04-Express路由和中間件 - 小之 - 博客園

nodeJS入門04-Express路由和中間件 Express框架是后臺的Node框架,在后臺的受歡迎的程度,和jQuery一樣,就是企業的事實上的標準。 路由 路由是指如何定義應用的端點(URIs)以及如何響應客戶端的請求。 路由是由一個 …

jmeter(四十五)常用Beanshell腳本

整理了一批jmeter常用的beanshell腳本供大家參考! 時間戳 import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; try{ Date date new Date(); //獲取當前時間 SimpleDateFormat sf new SimpleDateFormat("yyyy-MM-dd HH:mm…

Critical error detected c0000374

我發現出現上述錯誤是 free 兩次內存 float* ddnew float[2];delete[] dd;delete[] dd;轉載于:https://www.cnblogs.com/hook-gou/p/9994662.html

nodejs開發 過程中express路由與中間件的理解 - pyj063 - 博客園

nodejs開發 過程中express路由與中間件的理解 nodejs開發 express路由與中間件 路由 通常HTTP URL的格式是這樣的: http://host[:port][path] http表示協議。 host表示主機。 port為端口,可選字段,不提供時默認為80。 path指定請求資源的…

錯誤MSB4018 “ResolvePackageAssets”任務意外失敗的解決方法

昨天系統奔潰了,重裝系統后發現,之前寫的.netcore項目打開后重新生成報錯,錯誤如下嚴重性 代碼 說明 項目 文件 行 禁止顯示狀態 錯誤 MSB4018 “ResolvePackageAssets”任務意外失敗。 NuGet.Packaging.Core.Packag…

(五)Unity插件生成

1)新建空的AndroidStudio工程,但是新建過程時最小SDK版本要與unity一致,如下圖所示,本次操作均為api16 2)創建Library,如下圖所示,新建module,然后選擇Android Library。 新建模塊為…

centeros7安裝mysql - 風中追風_lonely - 博客園

轉載自:https://www.linuxidc.com/Linux/2016-09/135288.htm 安裝之前先安裝基本環境:yum install -y perl perl-Module-Build net-tools autoconf libaio numactl-libs 1、配置YUM源 在MySQL官網中下載YUM源rpm安裝包:http://dev.mysql.c…

失物招領平臺6

昨天做了什么:學習了復選框、列表視圖、網絡視圖,集體討論了登錄頁面的構思 今天準備做什么:繼續學習Android stdio,改善登錄頁面 遇到的問題:時間遠遠不夠。轉載于:https://www.cnblogs.com/sljslj/p/11056074.html

前后端交互json字符串

//將需要的參數轉成json字符串,然后用utf-8編碼 var obj encodeURIComponent(JSON.stringify(this.categories),"utf-8") //后臺將前臺的json字符串按照utf-8的格式解碼,然后進行轉換 RequestMapping(value "/updateMaterialDemoInfo.d…

CSS布局解決方案(終結版)

前端布局非常重要的一環就是頁面框架的搭建,也是最基礎的一環。在頁面框架的搭建之中,又有居中布局、多列布局以及全局布局,今天我們就來總結總結前端干貨中的CSS布局。 居中布局 水平居中 1)使用inline-blocktext-align &…

個人作業7 第一階段SCRUM沖刺(七)

了解了一下云服務器,下載了阿里云。 然而搞了半天還是沒應用上這個云服務器..轉載于:https://www.cnblogs.com/jbwen/p/11071733.html

Dcloud HTML5 監聽藍牙設備 調用 原生安卓實現 - aspirant - 博客園

最近一直搞Dcloud ,這是HTML5版本的開發,打包時候,可以打包成 apk 和ipa 分別運行在安卓和ios 機器上面, 但是這里面的資料很少,遇到問題,之后只能自己鉆研總結, 現在有這么一個需求&#xff…

NOIP2018游記

NOIP 2018 游記 又是一年 \(NOIP\) 呢...第二次參加了,希望這一次能不再擦線吧...畢竟我真的很想去 \(WC\) ,也很想去省選. 最后悔的事就是在初三了,恰逢直升,大好年華,停課學 \(OI\) ,但我竟然在某兩位 \(dalao\) 帶領下搓了一年 爐石 \(\& \: SC2\) ?&#xf…

四葉草社交平臺——十天沖刺(5)

今天沒能安排好各種的任務,姑且拍了張照片就散了。 我的任務就是把登錄功能完成,先讓其他人把資源載入問題解決了,然后我再看看動態如何發送。 轉載于:https://www.cnblogs.com/limitCM/p/10925161.html

Django forms組件

校驗字段 模板文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <form action"" method"post"><p>用戶名: <…

為什么要用TypeScript - 肉豬 - 博客園

為什么要用TypeScript 以下是本人的一點拙見&#xff0c;歡迎指正。 TypeScript的設計目的應該是解決JavaScript的“痛點”&#xff1a;弱類型和沒有命名空間&#xff0c;導致很難模塊化&#xff0c;不適合開發大型程序。另外它還提供了一些語法糖來幫助大家更方便地實踐面向…

java繼承上機作業

實現如下類之間的繼承關系&#xff0c;并編寫Music類來測試這些類。 1 package su;2 3 class Instrument{4 public void play() {5 System.out.println("彈奏樂器");6 }7 8 public void play2() {9 // TODO 自動生成的方法存根 10 …

自定義標簽的作用

1&#xff09;控制標簽體內容是否輸出 2&#xff09;控制標簽余下內容是否輸出 3&#xff09;控制重復輸出標簽體內容 4&#xff09;改變標簽體內容 5&#xff09;帶屬性的標簽 package com.loaderman.demo.a_tag;import java.io.IOException; import java.io.StringWriter;imp…

前端之模擬數據 - HackerVirus - 博客園

閱讀目錄 玩轉前端之模擬數據 回到目錄 玩轉前端之模擬數據 博客園主頁&#xff1a;http://www.cnblogs.com/handoing/ 是否還在為前端模擬數據頭疼&#xff1f; 是否還在為后端返回數據格式較多內心煩躁&#xff1f; 是否還想吸一支煙壓壓精&#xff1f; 看下去吧&#x…

Leetcode No.146 ****

運用你所掌握的數據結構&#xff0c;設計和實現一個 LRU (最近最少使用) 緩存機制。它應該支持以下操作&#xff1a; 獲取數據 get 和 寫入數據 put 。 獲取數據 get(key) - 如果密鑰 (key) 存在于緩存中&#xff0c;則獲取密鑰的值&#xff08;總是正數&#xff09;&#xff…