1. 程式人生 > 實用技巧 >python的json,hashlib,base64模組

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、鍵值對由逗號分隔。

3、大括號裡面儲存物件。
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、列表、字典。

pythonjson
字典 物件
列表或元組 陣列
字串 字串
int或float 數字
True或False true或false
None null
json模組的API
json的APIAPI說明
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的APIAPI說明
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