您的位置:首页 > Web前端 > JavaScript

json、hashlib、base64

2020-01-15 06:47 127 查看

Python常用模块

一、json模块

1.json概述

json是一种基于文本,独立于语言的轻量级数据交换格式,以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象(键值对)。json其实就是一种文本格式,用来在不同的应用中传递数据

json字符串案例:

{"name":"志昊", "age": 18, "salary": 5000.5, "hobby": ["money", "girl"]}

特点:轻量级的文本数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成,Web世界当中最理想的数据交换格式

目前互联网开发前后端数据交互使用的基本都是json

2.语法规则

数据由键值对组成,键值对由逗号分隔

字符串一定要用双引号

python json
字典 对象
列表 数组
字符串 字符串
int或float 数字
True,False true或false
None null

3.json模块接口(json模块API)

json.dumps(obj)         # 将python数据转化为json数据
json.loads(s)           # 将json数据转化为python数据
json.dump(obj, fp)      # 转换为json数据并保存在文件中
json.load(fp)           # 从文件中读取json,并转化为python数据
ensure_ascii			# 是否用ASCII解析
indent					# 实现缩进
# **************************************************
obj:python数据
s:json数据
fp:函数别称
ensure_ascii、indent:仅仅在python转为json数据时可使用

4.代码案例

import json

# json 格式的字符串
json_str = '{"name":"志昊", "age": 18, "salary": 5000.5, "hobby": ["money", "girl"]}'
# 需求,改掉 name对应的值,为‘zhihao’
# json字符串 -> python object
# json 字符串转换成 python中的数据类型
data = json.loads(json_str)     # 转换成字典
print(data)
print(type(data))
data['name'] = "zhihao"
data['hobby'].append('跑')
print(data['hobby'][-1])
print(data)
# python object -> json 字符串
json_str = json.dumps(data, ensure_ascii=False, indent=4)   # 非ASCII码解析,缩进为4
print(json_str)
print(type(json_str))
**************************************************************
{'name': '志昊', 'age': 18, 'salary': 5000.5, 'hobby': ['money', 'girl']}
<class 'dict'>
跑
{'name': 'zhihao', 'age': 18, 'salary': 5000.5, 'hobby': ['money', 'girl', '跑']}
{
"name": "zhihao",
"age": 18,
"salary": 5000.5,
"hobby": [
"money",
"girl",
"跑"
]
}
<class 'str'>
student.json:"hello world"
**************************************************************
import json

with open("student.json", "r", encoding="utf-8") as f:  # 只读方式打开
# json_str = f.read()           # 读取数据存入json_str
# data = json.loads(json_str)   # 将json数据转为python数据

data = json.load(f)         # 将"student.json"中json数据转为python数据
print(data)

with open("new.json", "w", encoding="utf-8") as f:     # 只写方式打开
# 将python数据转为json数据存入json_str
# json_str = json.dumps(data, ensure_ascii=False, indent=4)
# f.write(json_str)         # 将json数据写入"new.json"

# 将data转为json数据并写入到"new.json"
json.dump(data, f, ensure_ascii=False, indent=4)
**************************************************************
hello world
student.json:"hello world"
new.json:"hello world"

二、hashlib

1.数据安全

数据时代,为了保证数据的安全性,防止数据泄露,往往会对数据进行加密,加密是最常用的安全保密手段,利用技术手段把重要的数据变为乱码(加密)传送,到达目的地后在用相同或者不同的手段还原(解密)

1.数据加密

  • 对称加密:数据加密和解密的秘钥相同
  • 非对称加密:加密和解密的秘钥不相同,公钥用于加密数据,私钥用于解密数据
  • 单向加密:只能加密,不能解密(原则上,不属于加密)

2.hash

一种算法的名称,哈希,散列

它是把,任意长度的输入通过算法转变成固定长度的输出,该输出就是散列

特点:

  • 不可逆:无法根据散列值来还原原来的数据

  • 定长输出:无论输入的原始数据有多长,结果长度是相同的

  • 抗修改性:输入的微小改变,哪怕只有一个字符,会引起结果的巨大改变

  • 强碰撞性:很难找到两段内容不同的数据,使他们产生的hash值一致,几乎不可能

应用:

  • 数据指纹
  • 区块链
  • 数据加密

2.hashlib模块的接口

提供了很多的hash算法,主要有:

  1. md5
  2. sha系列:sha1,sha224,sha256,sha384,sha512
api 描述
hashlib.Hash算法名(data=b”) 生成一个hash对象
hashlib.Hash算法名(data=b”) 生成一个使用该算法的hash对象
Hash对象.update(arg=None) 更新hash对象
Hash对象.digest() 返回Hash算法计算得到的值(bytes类型)
Hash对象.hexdigest() 返回Hash算法计算得到的值(str类型)

3.代码案例

# 使用hashlib
import hashlib

info = "志昊"
m = hashlib.md5(info.encode())  # 注意一定要转为二进制数
res1 = m.hexdigest()        # 散列字符串
res2 = m.digest()           # 二进制数据
print(m)
print(res1)
print(res2)
**************************************************************
<md5 HASH object @ 0x0000024B158F5E40>
157383879fd8305e1592d6c08fe8e6a8
b'\x15s\x83\x87\x9f\xd80^\x15\x92\xd6\xc0\x8f\xe8\xe6\xa8'
import hashlib

# 1.选择一种算法, 创建一个算法对象
m = hashlib.md5()
# 2. 添加数据
m.update('志'.encode())
m.update('昊'.encode())
# 3.获取散列结果
res = m.hexdigest()
print(res)
**************************************************************
157383879fd8305e1592d6c08fe8e6a8

大文件hash

one.wmv 为视频文件名
**************************************************************
# 使用hashlib  hash 大文件
import hashlib

# 1.创建算法对象
m = hashlib.md5()
# 2.读取文件
with open('one.wmv', 'rb') as f:
for line in f:
m.update(line)

res = m.hexdigest()
print(res)

三、base64

1.概念

base64是一种用64个字符来表示任意二进制数据的方法,将二进制数转换成字符串。

特点:

  • 用来将非ASCII字符的数据转换成ASCII字符的一种方法

  • 常用于对URL的编码

  • 可以将不可打印的二进制数据转化为可打印的字符串

用途:

  • 二进制转文本便于网络传输
  • 简单加密,不可见

2.原理

  1. 标准的base64编码

    首先准备一个包含64个字符的数组:

    ['A', 'B',...,'a', 'b',...'0', '1',...'9', '+', '/']

    对二进制数据进行梳理,每3个字节为一组,一共就是3*8=24位,划分成4组,每组刚好6位

    然后将6位二进制数转换成10进制数,得到4个索引,然后查表,获得相应的4个字符,就是编码后的字符串。

    如果要编码的二进制数长度不是3的倍数,最后会剩下 1,或者2个字节,就是用

    \x00
    再末尾补充

    再到编码末尾加上1到2个

    =
    号,表示补了多少个字节,解码的时候,会自动去掉。

    ‘a’

    01100001 00000000 00000000

    011000 010000 000000 000000

    24 16 0 0

    Y Q = =

  2. 自定义base64编码

    其实就是改变字符串数组的字符,和顺序

  3. url safe 编码

    Base64编码后的数据可能会含有 + / 两个符号,如果编码后的数据用于URL或文件的系统路径中,
    就可能导致Bug,所以base模块提供了专门编码url的方法

    它将

    +, /
    替换成
    -,_
    ,并且去掉补齐的
    =

3.模块的接口

编码接受的是二进数据,返回的也是二进数据

解码接受的也是二进数据,返回的也是二进数据

api 描述
base64.b64encode(s) 对二进制数据进行base64编码
base64.b64decode(s) 对通过base64编码的数据进行解码
base64.urlsafe_b64encode(s) 对URL进行base64编码
base64.urlsafe_b64decode(s) 解码

4.代码案例

import base64

data = "a"
res1 = base64.b64encode(data.encode())   # 编码    必须传入二进制数
print(res1)
res2 = base64.b64decode(res1)   # 解码  返回的是二进制数
print(res2)
res2 = res2.decode("utf-8")     # 二进制数转为"utf-8"
# res2 = base64.b64decode(res1).decode("utf-8")   #解码
print(res2)
**************************************************************
b'YQ=='
b'a'
a
import base64

url = "https://www.python.org"
res1 = base64.urlsafe_b64encode(url.encode())   # 编码    必须传入二进制数
print(res1)
res2 = base64.urlsafe_b64decode(res1)   # 解码  返回的是二进制数
print(res2)
**************************************************************
b'aHR0cHM6Ly93d3cucHl0aG9uLm9yZw=='
b'https://www.python.org'
import base64

url = b"\xfb\xff\xbf"       # fbf可输出-_
res1 = base64.urlsafe_b64encode(url)   # 编码    必须传入二进制数
print(res1)
res2 = base64.urlsafe_b64decode(res1)   # 解码  返回的是二进制数
print(res2)
**************************************************************
b'-_-_'
b'\xfb\xff\xbf'
  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
弓长志昊 发布了31 篇原创文章 · 获赞 73 · 访问量 1543 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: