zoukankan      html  css  js  c++  java
  • day18:json模块&time模块&zipfile模块

    json模块

    1.关于json的定义

    所有的编程语言都能够识别的数据格式叫做json,是字符串
    能够通过json序列化成字符串与如下类型: (int float bool str list tuple dict None)

    2.json用法

    # 1.dumps和loads是一对,可以序列化字符串
    dic = {"name":"Libolun","age":81,"classroom":"python31","family":["老爸","老妈","哥哥"]}
    # ensure_ascii=False 显示中文 sort_keys=True 对字典的键进行排序
    res = json.dumps(dic,ensure_ascii=False,sort_keys=True)
    print(res , type(res))
    
    # loads反序列化原来的数据类型
    dic = json.loads(res)
    print(dic,type(dic))
    # 2.dump 和 load 是一对,针对于文件,把数据序列化后存储文件
    dic = {"name":"Libolun","age":81,"classroom":"python31","family":["老爸","老妈","哥哥"]}
    with open("ceshi0728.json",mode="w",encoding="utf-8") as fp:
        json.dump(dic,fp,ensure_ascii=False)
    
    with open("ceshi0728.json",mode="r",encoding="utf-8") as fp:
        dic = json.load(fp)
        print(dic, type(dic))

    3.json和pickle的差别

    json可以连续dump,但是不可以连续load

    json的连续dump:

    """json 可以连续dump , 但是不能连续load"""
    dic1 = {"a":1,"b":2}
    dic2 = {"c":3,"d":4}
    with open("0728_2.json",mode="w",encoding="utf-8") as fp:
        json.dump(dic1,fp)
        fp.write("
    ")
        json.dump(dic2,fp)
        fp.write("
    ")

    为什么json不可以连续load呢?

    原因:load 在获取数据时,是一次性拿取所有内容

    错误的示范:

    with open("0728_2.json",mode="r",encoding="utf-8") as fp:
        res = json.load(fp)
        print(res)
    '''这样是不可行的,load会一次性把所有数据都拿出来'''

    解决办法:(for循环遍历fp文件对象,一个一个loads)

    with open("0728_2.json",mode="r",encoding="utf-8") as fp:
        for i in fp:
            dic = json.loads(i)
            print(dic,type(dic))

    pickle可以连续dump 也可以连续load 因为pickle在存储数据的时候会在末尾加上结束符

    pickle的连续dump和连续load

    """pickle 可以连续dump 也可以连续load 因为pickle在存储数据的时候会在末尾加上结束符"""
    import pickle
    dic1 = {"a":1,"b":2}
    dic2 = {"c":3,"d":4}
    with open("0728_3.pkl",mode="wb") as fp:
        pickle.dump(dic1,fp)
        pickle.dump(dic2,fp)
    
    with open("0728_3.pkl",mode="rb") as fp:
        dic1 = pickle.load(fp)
        print(dic1 , type(dic1))
        dic2 = pickle.load(fp)
        print(dic2 , type(dic2))

    使用pickle获取文件当中的所有数据

    # try ... except ... 异常处理(用来抑制错误的)
    """
    try :
        可能报错的代码
    except:
        如果报错执行except这个代码块;
    """
    # 获取文件当中所有的数据
    try:
        with open("0728_3.pkl",mode="rb") as fp:
            while True:
                res = pickle.load(fp)
                print(res)
    except:
        pass

    json和pickle两个模块的区别

    1.json序列化之后的数据类型是str,所有编程语言都识别,
    但是仅限于(int float bool)(str list tuple dict None)
    json不能连续load,只能一次性拿出所有数据
    2.pickle序列化之后的数据类型是bytes,
    所有数据类型都可转化,但仅限于python之间的存储传输.
    pickle可以连续load,多套数据放到同一个文件中
    3.json使用的广泛性比pickle更强.

    time模块

    time:时间戳

    localtime:时间戳转化成时间元组

    mktime:时间元组转化成时间戳

    ctime:时间戳转化为时间字符串

    strftime:时间元组转化为时间字符串

    strptime:时间字符串转化为时间元组

    # ### time 时间模块
    import time
    
    #  localtime -> mktime -> ctime
    #  时间元组 -> 时间戳 -> 时间字符串

    # time() 获取本地时间戳 (*) res = time.time() print(res) # localtime() 获取本地时间元组(参数是时间戳,默认当前) (*) res = time.localtime() print(res) """ time.struct_time( tm_year=2020, tm_mon=7, tm_mday=28, tm_hour=10, tm_min=45, tm_sec=9, tm_wday=1, tm_yday=210, tm_isdst=0 ) """ # 指定时间戳,返回时间元组 ttp = 1595904161 res = time.localtime(ttp) print(res) # mktime() 通过时间元组获取时间戳(参数是时间元组) (*) ttp = (2020,7,28,10,48,30,0,0,0) res = time.mktime(ttp) print(res) # 1595904510 # ctime() 获取本地时间字符串(参数是时间戳,默认当前) (*) res = time.ctime() # 默认以当前时间戳获取时间字符串 print(res) # 指定时间戳 res = time.ctime(1595904161) print(res) # asctime() 通过时间元组获取时间字符串(参数是时间元组)(了解) ttp = (2020,7,28,10,54,30,6,0,0) # 不能自动识别周几. res = time.asctime(ttp) print(res) # 改造办法 ttp = (2020,7,28,10,54,30,0,0,0) res = time.mktime(ttp) str_time = time.ctime(res) print(str_time) # sleep() 程序睡眠等待 (*) """ time.sleep(2) print("我睡醒了") """ """ strftime => 把时间元组 -> 时间字符串 strptime => 把时间字符串 -> 时间元组 """ # strftime() 格式化时间字符串(格式化字符串,时间元祖) (*) # 1.默认按照当前时间做格式化 res = time.strftime("%Y-%m-%d %H:%M:%S") print(res) # 2.指定时间元组,对时间字符串格式化 """strftime如果在windows当中出现中文,直接报错,不能解析,linux 可以支持""" ttp = (2000,10,1,12,12,12,0,0,0) res = time.strftime("%Y-%m-%d %H:%M:%S" , ttp) print(res) # strptime() 将时间字符串通过指定格式提取到时间元组中(时间字符串,格式化字符串) (*) """要求字符串不能乱加符号,必须严丝合缝.""" strvar = "2020年7月28号11时12分13秒是著名歌星庾澄庆的生日" ttp = time.strptime(strvar,"%Y年%m月%d号%H时%M分%S秒是著名歌星庾澄庆的生日") print(ttp) # perf_counter() 用于计算程序运行的时间 (了解) # 记录开始时间 # startime = time.perf_counter() startime = time.time() for i in range(100000000): pass # 记录结束时间 # endtime = time.perf_counter() endtime = time.time() print(endtime - startime)

    用time模块实现动态进度条

    进度条准备工作

    import time
    
    # (1) 定义进度条的样式
    '''%-50s让#号居左显示且占50个空位'''
    print("[%-50s]" % ("#"))
    print("[%-50s]" % ("###############"))
    print("[%-50s]" % ("#########################"))
    
    # (2) 让进度条动起来
    
    strvar = ""
    for i in range(50):
        strvar += "#"
        time.sleep(0.1)
        print("
    [%-50s]" % (strvar) , end="" ) # 
    的作用:将后面的字符直接拉到当前行行首

    实现一个动态的进度条

    # (3) 根据文件的大小,调整进度条的位置
    # 假设文件的大小是 1024000
    def progress(percent):    
        # 如果百分比超过了1,说明数据已经接受完毕;
        if percent > 1:
            percent = 1
        
        # 打印对应的#号效果
        strvar = "#" * int(percent * 50) 
        # %% => %
        print("
    [%-50s] %d%%" % (strvar,int(percent * 100)) , end="" )
    
    # 初始化接受的字节数
    recv_size = 0
    # 文件接受总大小 
    total_size = 1024000
    while recv_size < total_size:
        recv_size += 1024
        # 模拟延迟
        time.sleep(0.01)
        # 计算百分比
        percent = recv_size/total_size #0.001
        # 调用进度条函数
        progress(percent)

    zipfile模块

    # ### zipfile 压缩模块
    import zipfile
    
    # 1.压缩文件
    # (1) 创建压缩包
    zf = zipfile.ZipFile("1424.zip","w",zipfile.ZIP_DEFLATED)
    # (2) 把文件写入到压缩包中
    # write(路径,别名)
    zf.write("/bin/cp","cp")
    zf.write("bin/chmod","chmod")
    # 可以临时创建一个文件夹在tmp在压缩包中
    zf.write("/bin/df","/tmp/df")
    # (3) 关闭压缩包
    zf.close()
    
    # 2.解压文件
    # (1) 打开压缩包
    zf = zipfile.ZipFile("1424.zip","r")
    # (2) 解压文件
    # 解压单个文件
    zf.extract("cp","ceshi1424_2")
    # 解压所有文件
    zf.extractall("ceshi1424")
    # (3) 关闭压缩包
    zf.close()
    
    # 3.追加文件(支持with语法)
    with zipfile.ZipFile("1424.zip","a",zipfile.ZIP_DEFLATED) as zf:
        zf.write("/bin/dir","dir")
    
    # 4.查看压缩包
    with zipfile.ZipFile("1424.zip","r",zipfile.ZIP_DEFLATED) as zf:
        lst = zf.namelist()
        print(lst)
  • 相关阅读:
    常用正则表达式
    The Skins Factory 界面设计欣赏
    The Regulator 轻松上手
    Visual C#的Web XML编程
    业务流程不是需求
    如使用ODBC连接informix
    AJAX在信息系统中的应用研究
    浅谈几个SQL的日志概念
    量产 朗科(Netac)朗盛系列闪存盘E108 8G 手记
    【转】告诉大家他们是怎么成为富翁的
  • 原文地址:https://www.cnblogs.com/libolun/p/13391569.html
Copyright © 2011-2022 走看看