• time&random&序列化&hashlib&shutil模块


    一、time&random模块

    print(time.localtime(1596097258.078811))
    
    aa = time.localtime(1596097258.078811)
    
    time.sleep(1)
    print(time.mktime(aa))
    
    print(time.asctime())
    
    print(time.strftime("%Y-%m-%d %H:%M", time.localtime())) # 显示本地时间
    
    print(time.strptime('2017-10-3 17:54', "%Y-%m-%d %H:%M")) #将时间字符转换成字符串
    
    
    import datetime
    
    print(datetime.date.today()) #当前日期
    print(datetime.datetime.now()) #现在时间
    
    import random
    
    print(random.randrange(1, 10)) # 一到十的随机数
    
    print(random.randrange(0, 100, 2)) #0到100的随机数步长为2
    print(random.random())
    

    二、序列化pickle&json模块

    定义:将一种数据结构如列表,字典,元组等转换成特殊的序列

    为什么存在序列化?

    • 数据存储再文件中,str形式存储,比如字典

    • 数据通过网络传输(bytes类型),不能还原回去

    • 特色的字符串:序列化

    1、以某种存储形式使自定义对象持久化

    2、将对象从一个地方传递到另一个地方。

    3、使程序更具维护性。

    img

    2.1 pickle模块

    • 只能是python语言遵循的一种数据转换格式,只能再python语言中使用
    • 支持python所有数据类型,包括实例化对象

    dumps和loads 只能用于网络传输

    import pickle
    dic = {'username':'老王','password':'123','status':'true'}
    st = pickle.dumps(dic) #转换为二进制数据
    print(st,type(st))
    
    
    l2 = pickle.loads(st) #将二进制数据还原成转换之前的类型
    print(l2,type(l2))
    

    dump和load可直接写入,还能转换多个数据

    import pickle
    dic = {'username':'老王'}
    dic1 = {'username':'老王1'}
    dic2 = {'username':'老王2'}
    
    f = open('pick多数据',mode='wb')
    pickle.dump(dic,f) #将多行数据转换成二进制格式
    pickle.dump(dic1,f)
    pickle.dump(dic2,f)
    f.close()
    
    
    
    f = open('pick多数据',mode='rb')
    print(pickle.load(f)) #将二进制数据进行还原
    print(pickle.load(f))
    print(pickle.load(f))
    f.close()
    
    

    pickle 将函数对象进行转换

    import pickle
    def func():
        print('in func')
    
    f = open('pickle11',mode='wb')
    pickle.dump(func,f) #将函数转换从二进制
    f.close()
    
    f = open('pickle11',mode='rb')
    
    ret = pickle.load(f) #将二进制数据进行还原
    print(ret)
    
    ret()
    
    

    2.2 json模块

    • 将数据结构转换成特殊的字符串,并且可以反转回去

    两对四种方法

    网络传输

    dumps loads 主要用于网络传输,但是也可以写入文件

    import json
    dumps loads 
    st = json.dumps(dic,ensure_ascii=False)
    print(st,type(st))
    
    
    dic1 = json.loads(st)
    print(dic1,type(dic1))
    
    # 转换成特殊的字符转写入文件
    with open('json文件',encoding='utf8',mode='w') as  f1:
        st = json.dumps(dic)
        f1.write(st)
    
    
    # 读取出来还原
    with open('json文件',encoding='utf8',mode='r') as f2:
        st = f2.read()
        l1 = json.loads(st)
        print(l1,type(l1))
    

    dump load 只能写入文件,只能写入一个数据结构

    # dump load 只能写入文件,只能写入一个数据结构
    dic = {'username':'老王','password':'123','status':'true'}
    with open('json文件1',encoding='utf-8',mode='w') as  f1:
        json.dump(dic,f1)
    
    
    # 读取数据
    dic = {'username':'老王','password':'123','status':'true'}
    with open('json文件1',encoding='utf-8') as  f1:
        ll = json.load(f1)
        print(ll,type(ll))
    

    一次写入文件多个数据怎么做?用dumps 和 loads

    dic = {'username':'老王'}
    dic1 = {'username':'老王1'}
    dic2 = {'username':'老王2'}
    with open('json2文件',encoding='utf8',mode='w') as  f1:
        f1.write(json.dumps(dic) + '
    ')
        f1.write(json.dumps(dic1) + '
    ')
        f1.write(json.dumps(dic2) + '
    ')
    
    
    with open('json2文件',encoding='utf8',mode='r') as  f1:
        for i in  f1:
            print(json.loads(i))
    

    三、hashlib模块

    包括很多加密算法,MD5,sh1 sha256 sha512

    1. 密码加密,不已 密文形式存储密码

    2. 文件的校验

    用法:

    1. 将bytes类型字节,转化成 固定长度的16进制数字组成的字符串
    2. 不同的bytes类型利用相同的算法(MD5)转换的结果一定不同
    3. 相同的bytes利用相同的算法(MD5)转换成的结果一定相同
    4. hashlib的算法是不可逆的(MD5被中国王晓云破解了)

    计算字符串MD5的值

    import hashlib
    s1 = 'sadfsadtgyq3ewrasdfvcsas拉拉设计的'
    ret = hashlib.md5()
    ret.update(s1.encode('utf-8'))
    print(ret.hexdigest())
    

    例子:校验用户登陆

    import hashlib
    
    def passwo(pwd):
        ret = hashlib.md5()
        ret.update(pwd.encode('utf-8'))
        return ret.hexdigest()
    
    
    def regidter():
        username = input("请输入一个用户名:").strip()
        password = input('请输入密码:').strip()
        password_md5 = passwo(password)
        with open('register',encoding='utf-8',mode='a') as  f1:
            f1.write(f'
    {username}|{password_md5}')
    
    regidter()
    
    
    
    def login():
        username = input("请输入一个用户名:").strip()
        password = input('请输入密码:').strip()
        passs_md5 = passwo(password)
        bidui = (f'{username}|{passs_md5}')
        with open('register',encoding='utf-8',mode='r') as  f1:
            readlines =  f1.readlines()
            b = []
            for i in readlines:
                a = i.strip()
                if a == bidui:
                    b.append(a)
            if not  b:
                print('用户名不存在或者密码错误')
            else:
                print(f'登录成功你的用户名|密码为:{b[0]}')
    login()
    
    

    MD5加盐

    import hashlib
    s2 = "123"
    
    ret = hashlib.md5('12'.encode('utf-8')) #这里的12就是加的盐,把12换成动态可变的就是动态加盐
    ret.update(s2.encode('utf-8'))
    print(ret.hexdigest())
    
    

    sha系列 ,金融类,安全类,用这个级别
    随着sha系列数字越高,加密越复杂,越不容易破解,但是耗时越长

    s2 = 'sadfasdfsdfa'
    ret = hashlib.sha3_512()
    ret.update(s2.encode('utf-8'))
    print(ret.hexdigest())
    

    文件校验

    import  hashlib
    # 文件校验
    def file_md5(path):
        ret = hashlib.sha3_256()
        with open(path,encoding='utf-8',mode='r') as f1:
            b1 = f1.read()
            ret.update(b1.encode('utf-8'))
        return  ret.hexdigest()
    reesult =  file_md5('json文件')
    print(reesult)
    
    

    四、文件copy模块shutil

    shutil.copyfileobj(fsrc, fdst[, length])

    将文件内容拷贝到另一个文件中

    import shutilshutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
    

    shutil.copyfile(src, dst)

    拷贝文件

    shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在
    

    shutil.copymode(src, dst)

    仅拷贝权限。内容、组、用户均不变

    shutil.copymode('f1.log', 'f2.log') #目标文件必须存在
    

    shutil.copystat(src, dst)

    仅拷贝状态的信息,包括:mode bits, atime, mtime, flags

    shutil.copystat('f1.log', 'f2.log') #目标文件必须存在
    

    shutil.copy(src, dst)

    拷贝文件和权限

    import shutilshutil.copy('f1.log', 'f2.log')
    

    shutil.copy2(src, dst)

    拷贝文件和状态信息

    import shutilshutil.copy2('f1.log', 'f2.log')
    

    shutil.ignore_patterns(*patterns)

    shutil.copytree(src, dst, symlinks=False, ignore=None)

    递归的去拷贝文件夹

    import shutilshutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除
    

    shutil.rmtree(path[, ignore_errors[, onerror]])

    递归的去删除文件

    import shutilshutil.rmtree('folder1')
    

    shutil.move(src, dst)

    递归的去移动文件,它类似mv命令,其实就是重命名。

    import shutilshutil.move('folder1', 'folder3')
    

    shutil.make_archive(base_name, format,…)

    创建压缩包并返回文件路径,例如:zip、tar

    可选参数如下:

    • base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,

    如 data_bak =>保存至当前路径

    如:/tmp/data_bak =>保存至/tmp/

    • format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
    • root_dir: 要压缩的文件夹路径(默认当前目录)
    • owner: 用户,默认当前用户
    • group: 组,默认当前组
    • logger: 用于记录日志,通常是logging.Logger对象
    #将 /data 下的文件打包放置当前程序目录
    import shutil
    ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data')
    
    #将 /data下的文件打包放置 /tmp/目录
    import shutil
    ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data')
    

    shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:

    zipfile压缩&解压缩tarfile压缩&解压缩

    import tarfile
    
    # 压缩
    >>> t=tarfile.open('/tmp/egon.tar','w')
    >>> t.add('/test1/a.py',arcname='a.bak')
    >>> t.add('/test1/b.py',arcname='b.bak')
    >>> t.close()
    
    # 解压
    >>> t=tarfile.open('/tmp/egon.tar','r')
    >>> t.extractall('/egon')
    >>> t.close()
    
  • 相关阅读:
    AsyncTask,MailTask,ScheduledTask
    Mysql的事务理解
    MySQL初识
    HTTP 的原理零散知识点
    SpringBoot简单搭建开发
    Android 的生命周期
    C51 虚拟元器件
    JavaSE 知识整合 (更新中……)
    java关键字篇
    Android开启网络权限
  • 原文地址:https://www.cnblogs.com/jiangjunwang/p/13413595.html
Copyright © 2020-2023  润新知