首页 > 技术文章 > python的json,hashlib,base64模块

leslielai 2020-09-03 22:29 原文

这个章节我们主要来看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



推荐阅读