python的json,hashlib,base64模組
這個章節我們主要來看json,haslib,base64模組,是python比較常用的模組,也是python在做專案時,前後端互動所必須的資料交換方式。
json模組
JSON(JavaScript Object Notation)是一種輕量級的資料交換格式。人類很容易讀寫。機器很容易解析和生成。JSON是一種完全獨立於語言的文字格式,用來傳輸有屬性值貨序列性的值組成的資料物件鍵值對。但使用C語言系列程式設計師熟悉的約定,包括C,C ++,C#,Java,JavaScript,Perl,Python等等。這些屬性使JSON成為理想的資料交換語言。
json語法規則:
1、資料由鍵值對組成。
2、鍵值對由逗號分隔。
4、中括號裡面儲存資料。
目前,網際網路開發前後端資料互動使用的基本都是json資料
import json
data_dict = { #python 字典
'name':'apple',
'age':18,
'sex':'M',
}
with open('test.py','a+') as f:
json.dump(data_dict,fp=f)
f.seek(0)
print(f.read())
輸出:
{"name": "apple", "age": 18, "sex": "M"} #JSON字串
Process finished with exit code 0
import json
data_dict = {
'name':'apple',
'age':18,
'feature':['高','富','帥']
}
with open('test.py','w+') as f:
res = json.dump(data_dict,fp=f,ensure_ascii=False,indent=4)
with open('test.py','r')as file:
rest = json.load(fp=file)
print(rest['feature'][0])
輸出:
高
Process finished with exit code 0
注意事項:
1、字串必須用雙引號 " " 來包括。
2、值可以是字串、數字、true、False、null、列表、字典。
python | json |
---|---|
字典 | 物件 |
列表或元組 | 陣列 |
字串 | 字串 |
int或float | 數字 |
True或False | true或false |
None | null |
json模組的API
json的API | API說明 |
---|---|
json.dumps(object) | 將python資料轉化位json indent實現縮排,ensure_ascii 是否用ascii解析 |
json.loads(s) | 將json資料轉化為python資料 |
json.dump(obj,fp) | 轉換位json,並儲存到檔案中 |
json.load(fp) | 從檔案中讀取json,並轉換為python |
import json
data_dict = {
'name':'apple',
'age':18,
'sex':'M',
'feature':['高','富','帥']
}
aa = json.dumps(data_dict,indent=4,ensure_ascii=True)
print(aa)
bb = json.loads(aa)
print(bb)
輸出:
{
"name": "apple",
"age": 18,
"sex": "M",
"feature": [
"\u9ad8",
"\u5bcc",
"\u5e05"
]
}
{'name': 'apple', 'age': 18, 'sex': 'M', 'feature': ['高', '富', '帥']}
Process finished with exit code 0
import json
data_dict = {
'name':'apple',
'age':18,
'sex':'M',
'feature':['高','富','帥']
}
with open('test.py','a+') as f:
json.dump(data_dict,fp=f)
f.seek(0)
print(f.read())
with open('test.py','r') as f:
aa = json.load(fp=f)
f.seek(0)
print(aa)
輸出:
{"name": "apple", "age": 18, "sex": "M", "feature": ["\u9ad8", "\u5bcc", "\u5e05"]}
{'name': 'apple', 'age': 18, 'sex': 'M', 'feature': ['高', '富', '帥']}
Process finished with exit code 0
haslib模組
資料時代,為了保證資料的安全性,防止資料外洩,往往對資料會進行加密,對一些敏感資料,加密措施就更加嚴密。
加密是最常用的安防手段,利用技術手段,把重要的資料進行加密變為亂碼傳送,到達目的地後在用相同或不同的方法還原解密。
1、對稱加密:資料加密解密使用相同的金鑰。
2、非對稱加密:資料加密和解密使用不同的金鑰,公鑰用於加密資料,私鑰用於解密資料。
3、單項加密:只能加密,不能解密資料。
hash結構:
雜湊函式,一般翻譯為雜湊,把輸入的任意長度的資料,通過雜湊函式進行轉換,變成一個長度固定的值(雜湊值),這個值基本是唯一的,簡單來說,hash演算法就是將任意長度的資料變為固定長度的資料的函式。
特點:
1、不可逆:無法根據雜湊值來還原原來的資料值。
2、定長輸出:無論輸入的原始資料有多長,結果長度是相同的。
3、抗修改性:輸入資料的微小改變,哪怕只有一個字元,會引起結果的巨大改變。
4、強碰撞性:很難找到兩端內容不同的資料,使他們產生的hash值一致,這幾乎使不可能的。
hashlib模組提供的API
hashlib模組提供了很多演算法,主要有:
1、md5
2、SHA系列:sha1、sha224、sha256、sha384、sha512.
hashlib模組的API:
hashlib的API | API說明 |
---|---|
hashlib.new(name,data='b') | 生成一個hash物件 |
hashlib.hash演算法名(data='b') | 生成一個使用該演算法的hash物件 |
hash物件.update(arg=None) | 更新hash物件 |
hash物件.digest() | 返回hash演算法計算所得到的值(bytes型別) |
hash物件.hexdigest() | 返回hash演算法計算所得到的值(str型別) |
import hashlib
messages_shici = '''
君不見,黃河之水天上來,奔流到海不復回。
君不見,高堂明鏡悲白髮,朝如青絲暮成雪。
人生得意須盡歡,莫使金樽空對月。
天生我材必有用,千金散盡還復來。
烹羊宰牛且為樂,會須一飲三百杯。
岑夫子,丹丘生,將進酒,杯莫停。
與君歌一曲,請君為我傾耳聽。
鐘鼓饌玉不足貴,但願長醉不復醒。
古來聖賢皆寂寞,惟有飲者留其名。
陳王昔時宴平樂,斗酒十千恣歡謔。
主人何為言少錢,徑須沽取對君酌。
五花馬,千金裘,呼兒將出換美酒,與爾同銷萬古愁。
'''
hash = hashlib.md5(messages_shici.encode()) #引數一定必須是bytes型別
print(hash.hexdigest()) #獲得str型別
print(hash.digest()) #獲得bytes結果
輸出:
1eaaaec8f67d06d7e7321cb28fc5d788
b'\x1e\xaa\xae\xc8\xf6}\x06\xd7\xe72\x1c\xb2\x8f\xc5\xd7\x88'
Process finished with exit code 0
base64模組(url編碼)
正常的url中只能包含ASCII字元的,也就是字母、數字和一些符號,url編碼就是一種規避一些特俗字元(比如漢字)的編碼方式。
base64是一種利用64個字元來表示任意二進位制的資料方法,(將二進位制資料編碼成ASCII字元),使用了A-Z、a-z、0-9、+、/這64個字元。
特點:
1、用來將非ASCII字元轉換為ASCII字元的一種方法
2、常用於對url的編碼
3、可以將不可列印的二進位制資料轉換為可列印的字串。
base64b模組的API
Base64編碼後的資料可能會含有 + / 兩個符號,如果編碼後的資料用於URL或檔案的系統路徑中,就可能導致Bug,所以base模組提供了專門編碼url的方法
API | 描述 |
---|---|
base64.b64encode(s) | 對二進位制資料進行base64編碼 |
base64.b64decode(s) | 對通過base64編碼的資料進行解碼 |
base64.urlsafe_b64encode(s) | 對url進行編碼 |
base64.urlsafe_b64decode(s) | 解碼 |
import base64
data = 'beijing'.encode()
#編碼
d_encode = base64.b64encode(data)
print('編碼資料:{}'.format(d_encode))
#解碼
d_decode = base64.b64decode(d_encode)
print('解碼資料:{}'.format(d_decode))
輸出:
編碼資料:b'YmVpamluZw=='
解碼資料:b'beijing'
Process finished with exit code 0
import base64
data = 'http://baidu.com'.encode()
#編碼
d_encode = base64.urlsafe_b64encode(data)
print('編碼資料:{}'.format(d_encode))
#解碼
d_decode = base64.urlsafe_b64decode(d_encode)
print('解碼資料:{}'.format(d_decode))
輸出:
編碼資料:b'aHR0cDovL2JhaWR1LmNvbQ=='
解碼資料:b'http://baidu.com'
Process finished with exit code 0