• 15.序列化模块-时间模块-zip压缩模块


    1.序列化模块: pickle 和 json

    1.1 序列化模块(bytes):pickle

    """
    序列化: 把不能够直接存储的文件中的数据变得可存储
    反序列化:把存储的数据拿出来恢复成原来的数据类型
    其他语言写法:
        序列化: serialize 
        反序列化:unserialize
    """
    import pickle	#引入模块
    
    # 1.dumps() 把任意对象序列化成一个字节流(bytes)
    def func():
        print("12代付款")
    res=pickle.dumps(func)# 把函数序列化
    # 2.loads() 把任意字节流(bytes)反序列化成原来的数据类型
    func1=pickle.loads(res)
    func1()
    
    # 3.dump(a,fp) 把a对象序列化后写入到文件对象fp中
    lst=[11,22,33]
    with open("1",mode="wb")as fp:
        pickle.dump(lst,fp)
    # 4.load(fp) 把文件对象中的内容拿出来,反序列化成原来的数据类型
    with open("1",mode="rb")as fp:
        res=pickle.load(fp)
    print(res)
    

    1.2 序列化模块(str): json

    """
    所有编程语言都能识别的数据格式叫json,是字符串
    能够转化的数据类型:  
        int float bool str list tuple dict None (没有复数和集合)
    """
    import json
    # 1.dumps 把对象序列化成一个str
    """
    参数:
        ensure_ascii=False  显示中文
        sort_keys=True      对字典的键进行排序
    """
    dic={"bb":"熊大","aa":"熊二"}
    res=json.dumps(dic) #不能显示中文
    print(res)
    res=json.dumps(dic,ensure_ascii=False)#可以显示中文
    print(res)
    
    # 2.loads 把任意str反序列成原来的数据类型
    res=json.loads(res)
    print(res,type(res))    #字典类型
    
    # 3.dump(a,fp) 把a对象序列化或写入到文件对象fp中
    with open("2",mode="w",encoding="utf-8")as fp:
        json.dump(dic,fp,ensure_ascii=False)
    # 4.load 把文件对象中的内容拿出来,反序列化成原来的数据类型
    """
    仅限文件有且只有一个数据时,多个数据报错
    """
    with open("2",mode="r",encoding="utf-8")as fp:
        res=json.load(fp)
        print(res,type(res))    #字典类型
    

    1.3 json 和 pickle 的区别

    """
    json: 
        序列化之后的类型是str,所有编程语言都能识别,一般做数据传输
        可以序列化的类型: int float bool str list tuple dict None
        json可以连续dump,但不能连续的load,只能一次性拿去所有数据
    pickle:
        序列化之后的类型是bytes,仅限于Python之间的存储传输
        所有数据类型都可以转化
        pickle可以连续dump,也可以连续load,多个数据放在同一文件中也能读取
    """
    # 1.json
    import json
    dic={"aa":"光头强","bb":22}
    lst=[1,2,3,4,5]
    
    # 序列化到文件,连续dump,数据之间需要换行
    with open("3",mode="w",encoding="utf-8")as fp:
        json.dump(dic,fp,ensure_ascii=False)
        fp.write("
    ")  #换行,在一行只能有一个数据,否则不能反序列化
        json.dump(lst,fp)
        
    # 反序列化读取文件
    """
    with open("3",mode="r",encoding="utf-8")as fp:
        res=json.load(fp)
        print(res)
    报错,load只能读取只有一个数据的文件
    """
    # 解决办法: 遍历文件,用loads反序列化对象
    with open("3",mode="r",encoding="utf-8")as fp:
        for i in fp:
            res=json.loads(i)
            print(res)
    
    # 2.pickle
    import pickle
    dic={"aa":"光头强","bb":22}
    lst=[1,2,3,4,5]
    
    # 序列化到文件,连续dump,数据之间随意,可以不换行
    with open("4",mode="wb")as fp:
        pickle.dump(dic,fp)
        pickle.dump(lst,fp)
    
    # 连续load
    with open("4",mode="rb")as fp:
        res1=pickle.load(fp)
        res2=pickle.load(fp)
        print(res1,res2)
    
    # 一次性把所有数据都拿出来
    """
    with open("4",mode="rb")as fp:
        while True:
            res=pickle.load(fp)
            print(res)
    会报错,Ran out of input 不能load空
    """
    # 异常处理的使用
    """
    try ... except...
        把有问题的代码写在try代码块中,如果报错执行except
    作用:
        抑制错误,不会导致程序中断
    """
    with open("4",mode="rb")as fp:
        try:
            while True:
                res=pickle.load(fp)
                print(res)
        except:
            pass
    

    2.时间模块: time

    import time
    # 1.time 获取本地时间戳
    print(time.time())
    
    # 2.localtime 获取本地时间元组
    """
    参数:(时间戳) 默认当前时间
    时间元组:(年,月,日,时,分,秒,星期,一年中第几天,是否是夏令时)
    """
    print(time.localtime())
    print(time.localtime(1607000000)) #指定时间戳
    
    # 3.mktime 通过时间元组获取时间戳(参数是时间元组)
    ttp=(2020,11,6,11,44,55,0,0,0)
    print(time.mktime(ttp))
    
    # 4.ctime 获取本地时间字符串(参数是时间戳)默认当前时间
    print(time.ctime())
    print(time.ctime(1607000000)) #指定时间戳
    
    # 5.asctime 通过时间元组获取字符串
    ttp=(2020,11,6,11,44,55,0,0,0)
    print(time.asctime(ttp))
    """
    不能自动识别星期,
    解决办法: 先mktime变成时间戳,再ctime变成字符串
    """
    res=time.mktime(ttp)
    res1=time.ctime(res)
    print(res1)
    
    # 6.sleep 程序睡眠等待时间(秒)
    time.sleep(1) #1秒后打印
    print("好好") 
    
    # 7.strftime 格式化时间字符串
    """
    参数:(格式化时间字符串,时间元组) 时间元组默认当前时间
    """
    res=time.strftime("当前时间:%Y-%m-%d %H:%M:%S")
    print(res)
    ttp=(2020,11,6,11,44,55,0,0,0)
    res=time.strftime("时间:%Y-%m-%d %H:%M:%S",ttp)#指定元组
    print(res)
    
    # 8.strptime 将时间字符串通过指定格式提取到时间元组中
    """
    参数:
        (原时间字符串,格式化字符串)
        两者必须严丝合缝,不能随便更改,否则报错
    """
    str1="1987年12月1日13时30分30秒"
    str2="%Y年%m月%d日%H时%M分%S秒"
    res=time.strptime(str1,str2)
    print(res)
    
    # 9,perf_counter  用于计算程序运行时间
    res1=time.perf_counter()#time.time()也可以
    for i in range(10000000):
        pass
    res2=time.perf_counter()
    print("程序运行时间{}".format(res2-res1))
    
    # 进度条
    import time
    def func(n):#传入百分比
        if n>1:
            n=1
        strvar=int(50*n)*"#"
        print("
    [%-50s]%d%%"%(strvar,n*100),end="")
    data=0  
    total=1111  #文件总大小
    while data<total:
        time.sleep(0.1)
        data+=100   #文件传输速度
        n=data/total    #占总文件大小比例
        func(n)
    

    3.压缩模块: zipfile

    # 压缩模块:zipfile(后缀为zip)
    """
    zipfile.ZipFile(file,mode,compression,allowZip64)
    功能:创建一个ZipFile对象,表示一个zip文件
    参数:
        file: 表示文件的路径或类文件对象
        mode: 指定打开文件模式,(默认值为 r )
            r ->代表读取已经存在的zip压缩文件
            w->代表新建(或覆盖)一个zip压缩文件
            a ->代表将数据追加到一个已经存在的zip压缩文件中
        compression: 表示压缩文件时的压缩方法
            zipfile.ZIP_STORED   ->只储存,不压缩,默认该模式
            zipfile.ZIP_DEFLATED->对文件进行压缩
        allowZip64: 如果需要压缩的文件超过2G,应该将该参数设为True
    """
    import zipfile
    # 1.创建压缩文件
    """
    1.ZipFile()              写模式w打开或者新建压缩文件
    2.write(路径,别名)   向压缩文件中添加文件内容
    3.close()                关闭压缩文件
    """
    zf=zipfile.ZipFile("1.zip","w",zipfile.ZIP_DEFLATED)
    zf.write("/bin/bash","bash")
    zf.close()
    # 支持with...as..语法,不需要手动close关闭文件
    with zipfile.ZipFile("1.zip","w",zipfile.ZIP_DEFLATED)as zf:
        zf.write("/bin/bash","bash")
    
    # 2.解压文件
    """
    1.ZipFile()               读模式r打开压缩文件
    2.extractall(路径)      解压所有文件到某个路径下
      extract(文件,路径)   解压指定的某个文件到某个路径下
    3.close()                  关闭压缩文件
    """
    with zipfile.ZipFile("1.zip")as zf: #默认模式为r
        zf.extractall("/home/jyh/aa")
    
    # 3.向压缩文件中追加文件
    with zipfile.ZipFile("1.zip","a",zipfile.ZIP_DEFLATED)as zf:
        zf.write("/bin/cat","cat")
    
    # 4.查看压缩文件:namelist() 返回列表
    with zipfile.ZipFile("1.zip")as zf:
        res=zf.namelist()
        print(res)
    
  • 相关阅读:
    Dockerfile
    走进Docker
    liunx 设置定时任务
    《程序员自我修养》读书笔记
    Ubuntu换源
    liunx安装python2.7.12
    预习非数值数据的编码方式
    预习原码补码
    第三章预习
    预习非数值数据的编码方式
  • 原文地址:https://www.cnblogs.com/jia-shu/p/14111592.html
Copyright © 2020-2023  润新知