python各种模块

强调

在创建py文件的时候文件名一定不能跟模块名冲突

os模块

系统模块

import os

创建文件夹

os.mkdir(r'文件夹01')  # 只能创建单级目录
os.makedirs(r'文件夹02\文件夹03')  # 可以创建多级目录
os.makedirs(r'文件夹03')
删除文件夹
os.rmdir(r'文件夹01')
os.rmdir(r'文件夹02\文件夹03')  # 默认只能删一级空目录
os.removedirs(r'文件夹02\文件夹03\文件夹04')  # 可以删除多级空目录
查看
print(os.listdir())  # 查看指定路径下所有的文件及文件夹
print(os.listdir('D:\\'))  # 查看指定路径下所有的文件及文件夹
print(os.getcwd())  # 查看当前所在的路径
os.chdir(r'文件夹03')  # 切换当前操作路径
print(os.getcwd())  # 查看当前所在的路径
判别
print(os.path.isdir(r'a.txt'))  # 判断是否是文件夹
print(os.path.isdir(r'文件夹03'))
print(os.path.isfile(r'a.txt'))  # 判断是否是文件
print(os.path.isfile(r'文件夹03'))
print(os.path.exists(r'a.txt'))  # 判断当前路径是否存在
print(os.path.exists(r'文件夹03'))
路径拼接
"""
不同的操作系统路径分隔符是不一样的
    windows是 \
    mac是 /
"""
res = os.path.join('D:\\','a.txt')  # 该方法可以针对不同的操作系统自动切换分隔符
文件大小
print(os.path.getsize(r'a.txt'))  # 字节数

hashlib模块

加密模块
将明文数据按照一定的逻辑变成密文数据
一般情况下密文都是由数字字母随机组合而成

加密算法
将明文数据按照一定的逻辑(每个算法内部逻辑都不一样)
加密之后的密文不能反解密出明文

常见加密算法:md5 base64 hmac sha系列
(算法生成的密文越长表示该算法越复杂)

import hashlib

普通加密

md5 = hashlib.md5()
将待加密的数据传入算法中
md5.update(b'hello')  # 数据必须是bytes类型(二进制)
获取加密之后的密文
res = md5.hexdigest()
print(res)

加盐加密

加盐处理:在对用户真实数据加密之前再往里添加额外的干扰数据
选择加密算法:一般情况下采用md5即可
md5 = hashlib.md5()
# 将待加密的数据传入算法中
# 加盐
md5.update('自己定制的盐'.encode('utf8'))
md5.update(b'hello')  # 数据必须是bytes类型(二进制)
# 获取加密之后的密文
res = md5.hexdigest()
print(res)
动态加盐
# 选择加密算法:一般情况下采用md5即可
md5 = hashlib.md5()
# 将待加密的数据传入算法中
# 加盐
md5.update('不固定 随机改变'.encode('utf8'))
md5.update(b'hello')  # 数据必须是bytes类型(二进制)
# 获取加密之后的密文
res = md5.hexdigest()
print(res)

random模块

随机数模块

import random

随机返回0-1之间的小数
print(random.random())
随机返回指定区间的整数 包含首尾
print(random.randint(1,6))  # 掷色子
随机抽取一个
print(random.choices(['一等奖','二等奖','谢谢回顾']))  # 抽奖
print(random.choice(['一等奖','二等奖','谢谢回顾']))
随机抽取指定样本个数
print(random.sample([111, 222, 333, 444, 555, 666, 777], 2))
随机打乱元素
l = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A", "小王", "大王"]
random.shuffle(l)  # 洗牌
print(l)
随机验证码
"""
产生一个五位数随机验证码(搜狗笔试题)
    每一位都可以是数字\小写字母\大写字母
"""
def get_code(n):
    code = ''
    for i in range(n):  # 循环五次决定是几位验证码
        # 每一次循环都应该是三选一
        # 随机的数字
        random_int = str(random.randint(0, 9))
        # 随机的小写字母
        random_lower = chr(random.randint(97, 122))
        # 随机的大写字母
        random_upper = chr(random.randint(65, 90))
        # 随机选择一个作为一位验证码
        temp = random.choice([random_int, random_lower, random_upper])
        code += temp
    return code
print(get_code(4))

logging模块

日志模块

import logging

日志级别
logging.debug('debug message')      #调试信息
logging.info('info message')       #正常信息
logging.warning('warning message')    #警告
logging.error('error message')      #出错
logging.critical('critical message')   #重大失误

越来越严重
debug和info没影响

 模板(用的时候复制黏贴就行)

import logging

file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
'''输出到某个文件''' logging.basicConfig( format
='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
'''     时间      某个人  触发了什么登记的日志  模式      日志的信息''' datefmt
='%Y-%m-%d %H:%M:%S %p', handlers=[file_handler,], level=logging.ERROR ) logging.error('你好') import time import logging from logging import handlers sh = logging.StreamHandler() rh = handlers.RotatingFileHandler('myapp.log', maxBytes=1024,backupCount=5) fh = handlers.TimedRotatingFileHandler(filename='x2.log', when='s', interval=5, encoding='utf-8') logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', handlers=[fh,sh,rh], level=logging.ERROR ) for i in range(1,100000): time.sleep(1) logging.error('KeyboardInterrupt error %s'%str(i)) import logging logger = logging.getLogger() # 创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log',encoding='utf-8') # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setLevel(logging.DEBUG) fh.setFormatter(formatter) ch.setFormatter(formatter) logger.addHandler(fh) #logger对象可以添加多个fh和ch对象 logger.addHandler(ch) logger.debug('logger debug message') logger.info('logger info message') logger.warning('logger warning message') logger.error('logger error message') logger.critical('logger critical message')

json模块

import json

简单的理解为
可以将其他数据类型转换成字符串
也可以将字符串转换成其他数据类型
序列化:将其他数据类型转换成json格式的字符串
d = {'username': 'jason', 'pwd': 123}
res = json.dumps(d)  #序列化
print(res, type(res)) # {"username": "jason", "pwd": 123} <class 'str'> d1 = {"username": "jason", "pwd": 123} print(d1) 只有json格式字符串才会是双引号 双引号就是判断json格式字符串的重要依据
反序列化:将json格式字符串转换成对应的数据类型
d = {'username': 'jason', 'pwd': 123}
res = json.dumps(d)
res1 = json.loads(res)  #反序列化
print(res1, type(res1))  # {'username': 'jason', 'pwd': 123} <class 'dict'>
文件序列化
d = {'username': 'jason', 'pwd': 123}
with open(r'a.txt','w',encoding='utf8') as f:
    json.dump(d,f)  #自动先序列化再写入
文件反序列化
d = {'username': 'jason', 'pwd': 123}
with open(r'a.txt','r',encoding='utf8') as f:
    res = json.load(f)  #自动变回字典导出  一个对一个,如果目标有多行字符串会报错,所以需要建个文件夹,把每条信息创一个文件
print(res,type(res))

并不是所有的python数据都可以转json格式字符串
转换表:
并不是所有的python数据都可以转json格式字符串
转换表:
Python          JSON
ict             object
list, tuple     array
str             string
int, float      number
True            true
False           false
None            null

优化注册登录功能

1.存储用户数据的文件自动创建

2.将用户注册的数据采用json格式存储
每个用户一个json文件

import os
import json
def sr():
    username=input('请输入用户名:').strip()
    password=input('请输入密码:').strip()
    return username,password


def cc(username):
    c = os.listdir(r'c')
    for linec in c:
        realname=linec
        if realname==username:
            print('用户名已存在')
            return True
    return False

def xr(username,password):
    res = os.path.join('c', '%s' % username)
    with open(r'%s'%res,'w',encoding='utf8') as f:
        d='%s|%s\n'%(username,password)
        json.dump(d,f)
        print('%s注册成功'%username)

def zc():
    username,password=sr()
    tf=cc(username)
    if tf:
        return
    xr(username,password)

def dl():
    username,password=sr()
    c = os.listdir(r'c')
    for linec in c:
        if username==linec:
            res = os.path.join('c', '%s' % linec)
            with open(r'%s' % res, 'r', encoding='utf8') as f:
                f1 = json.load(f)
                realname, realword = f1.split('|')
                if username==realname and password==realword.strip('\n'):
                    print('登陆成功')
                    return
    print('用户名或密码错误')

dict={'1':zc,'2':dl}

pb=os.path.exists(r'c')
if pb==True:
    pass
else:
    os.mkdir(r'c')

while True:
    print('1.注册'
            '2.登录')
    choice=input('请输入编号:')
    if choice in dict:
        dictname=dict.get(choice)
        dictname()
    else:
        print('?')

 

posted @ 2021-08-21 19:31  雾雨黑白  阅读(43)  评论(0编辑  收藏  举报