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算法,主要有:
- md5
- 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.原理
-
标准的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 = =
-
自定义base64编码
其实就是改变字符串数组的字符,和顺序
-
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'