这个章节我们主要来看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、列表、字典。
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