【Python相关包】Json / 加密 / 编码 / 日志
Json / 加密 / 编码 / 日志
一、JSON数据
1、JSON的定义
- 前后端交互时,规定用 JSON 格式传输
- JSON内存较小,内建库、标准库 涵盖在python里,不需要pip install。
- JSON格式与Python中的字典相似
2、JSON的应用
-
json.dumps() 把 字典 转化为 JSON
import json dict_a = {'name':'April','age':None,'isBeautiful':True} json_a = json.dumps(dict_a) # json.dumps()把字典转化为JSON,相当于encode编码。 print(json_a) ===> {"name": "April", "age": null, "isBeautiful": true} # json.dumps()把字典转化为JSON时, ''' 1. 双引号变成单引号, 2. None(python用None)变成null(前端用null), 3. True(python布尔值首字母大写)变成true(前端布尔值用小写)。 '''
-
json.loads() 把 JSON 转化为 字典
import json dict_a = {'name':'April','age':None,'isBeautiful':True} json_a = json.dumps(dict_a) # print(json_a) # {"name": "April", "age": null, "isBeautiful": true} new_dict_a = json.loads(json_a) # json.loads()把JSON转化为字典,相当于decode解码。 print(new_dict_a) ===> {'name': 'April', 'age': None, 'isBeautiful': True}
-
JSON文件(创建json文件、读取为字典)
# 创建json文件 import json dict_a = {'name':'April','age':None,'isBeautiful':True} json_a = json.dumps(dict_a) # print(json_a) # {"name": "April", "age": null, "isBeautiful": true} new_dict_a = json.loads(json_a) # print(new_dict_a) # {'name': 'April', 'age': None, 'isBeautiful': True} with open("AAA.json", 'w') as f: json.dump(dict_a,f) ===> 文件AAA.json ===> {"name": "April", "age": null, "isBeautiful": true}
# 读取json文件 import json with open("AAA.json", 'r') as f1: new_dict_b = json.load(f1) # load 没有 s ,loads是把json数据转化字典的,load是把json文件转化字典的。 print(new_dict_b) ===> {'name': 'April', 'age': None, 'isBeautiful': True}
二、加密hashlib
1、三种加密方式(网络安全)
- 对称加密:用什么锁锁起来的,就要用什么锁开。(摩斯密码 ···;凯撒密码 a=d, b=e, c=f, d=g, e=h)
- 非对称加密:gitee,github 解密和加密的钥匙是不一样的。自己得到秘钥,把公钥交出去。
- 单项加密:杜绝数据库人员看到你的注册密码。
2、hashlib 二进制加密
import hashlib
a = b"hello world" # 转换为二进制再进行加密
m = hashlib.md5()
m.update(a)
result = m.hexdigest()
print(result)
# 5eb63bbbe01eeed093cb22bb8f5acdc3
# 加密一般就没法转换回去了。像md5、sha1这样已经被破解出来的就不怎么用了。
# 稍微改动a = b"helloworld",结果完全不同了 # fc5e038d38a57032085441e7fe7010b0
# 加盐:后面随机加一些字符串,用来提升撞击出来密码(破获密码)的难度。(加密时间越长,解密时间越长)
三、base64编码
1、base64 的URL编码
# Base64:以64个字符来表示任意二进制的数据
import base64
a = b'abc'
b = b'abcd'
c = b"abcde"
d = b'abcdef'
# 编码
bs64_a = base64.b64encode(a)
bs64_b = base64.b64encode(b)
bs64_c = base64.b64encode(c)
bs64_d = base64.b64encode(d)
print(bs64_a) # b'YWJj'
print(bs64_b) # b'YWJjZA=='
print(bs64_c) # b'YWJjZGU='
print(bs64_d) # b'YWJjZGVm'
# =等号是用来补足到4的倍数的。
# 解码
April = base64.b64decode(bs64_a)
print(April) # b'abc'
"""
Base64的底层转换逻辑
a b c
10进制 97 98 99 # a b c对应的ascll码
2进制 1100001 1100010 1100011 # 十进制转化为二进制
0补成八位数
01100001 01100010 01100011
6个数字切一次 (切割二进制)
011000 010110 001001 100011
10进制 24 22 9 35
索引 Y W J j # Base64编码表索引
所以 'abc'===> ywjk
"""
2、某些最后有=号的激活码一般就是base64编码
四、logging 日志
1、logging列表
%(name)s | Logger的名字 |
---|---|
%(levelno)s | 数字形式的日志级别 |
%(levelname)s | 文本形式的日志级别 |
%(pathname)s | 调用日志输出函数的模块的完整路径名,可能没有 |
%(filename)s | 调用日志输出函数的模块的文件名 |
%(module)s | 调用日志输出函数的模块名 |
%(funcName)s | 调用日志输出函数的函数名 |
%(lineno)d | 调用日志输出函数的语句所在的代码行 |
%(created)f | 当前时间,用UNIX标准的表示时间的浮 点数表示 |
%(relativeCreated)d | 输出日志信息时的,自Logger创建以 来的毫秒数 |
%(asctime)s | 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 |
%(thread)d | 线程ID。可能没有 |
%(threadName)s | 线程名。可能没有 |
%(process)d | 进程ID。可能没有 |
%(message)s | 用户输出的消息 |
2、logging错误等级(5个)
import logging
# 错误等级
a = "hello world"
logging.debug(a) # 不打印在终端,程序可以继续运行。
logging.info(a) # 不打印在终端,程序可以继续运行。
logging.warning(a) # WARNING:root:hello world 警告,有可能出现错误。是默认等级。
logging.error(a) # ERROR:root:hello world 错误,告诉你代码有问题。不停服更新,打补丁。
logging.critical(a) # CRITICAL:hello world 危险等级,非常严重。下线、回炉重造。停服维护。
3、使用日志器
import logging
# 创建对象
logger = logging.getLogger("hello")
# 创建两个种类的处理对象(控制台,文件)
# 1.将日志输出到控制台
streamH = logging.StreamHandler()
# streamH.setLevel(logging.DEBUG) # 设置debug等级
# 2.将日志输出到test_log.txt文件
fileH = logging.FileHandler(r"test_log.txt")
# r是用来转义的,比如r"\test_log.txt"中“\”失去了在python中的反斜杠含义,只是表示路径。
#设置日志的记录格式并且和处理对象进行关联
formatter = logging.Formatter('%(asctime)s---%(levelname)s---%(message)s---%(filename)s---%(lineno)d')
'''
1、%(asctime)s:字符串形式的当前时间。默认格式是 “2008-08-08 17:27:20,032”。逗号后面的是毫秒
2、%(levelname)s:文本形式的日志级别
3、%(message)s:用户输出的消息
4、%(filename)s:调用日志输出函数的模块的文件名
5、%(lineno)d:调用日志输出函数的语句所在的代码行
'''
streamH.setFormatter(formatter)
fileH.setFormatter(formatter)
# 将日志、对象关联
logger.addHandler(streamH)
logger.addHandler(fileH)
if __name__ == '__main__':
logger.debug("haha")
logger.info('hehe')
logger.error('xixi')
logger.warning('heihei')
'''
test_log.txt文件和控制台:
2022-04-03 17:27:20,032---ERROR---xixi---123.py---26
2022-04-03 17:27:20,034---WARNING---heihei---123.py---27
'''
本文来自博客园,作者:April071,转载请注明原文链接:https://www.cnblogs.com/April071/p/16102772.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?