【Python相关包】Json / 加密 / 编码 / 日志

Json / 加密 / 编码 / 日志

一、JSON数据

1、JSON的定义

  1. 前后端交互时,规定用 JSON 格式传输
  2. JSON内存较小,内建库、标准库 涵盖在python里,不需要pip install。
  3. JSON格式与Python中的字典相似

2、JSON的应用

  1. 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(前端布尔值用小写)。
    '''
    
  2. 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}	
    
  3. 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、三种加密方式(网络安全)

  1. 对称加密:用什么锁锁起来的,就要用什么锁开。(摩斯密码 ···;凯撒密码 a=d, b=e, c=f, d=g, e=h)
  2. 非对称加密:gitee,github 解密和加密的钥匙是不一样的。自己得到秘钥,把公钥交出去。
  3. 单项加密:杜绝数据库人员看到你的注册密码。

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

'''

posted @ 2022-04-05 16:27  April071  阅读(113)  评论(0编辑  收藏  举报