zoukankan      html  css  js  c++  java
  • Python包,json&pickle,time&datetime,random模块

     

    补充内容:

    解决模块循环导入的两种方法:(不得已而为之,表示程序结构不够严谨)

    1. 将导入模块语句放在文件最下方 保证语句导入之前函数内代码能够被执行

    2. 将导入语句放进函数体内 使其不影响整个函数的运行


     

    1.什么是包

    • 包是一种管理python模块命名空间的形式,采用‘点模块名称’的导入方式

      比如一个模块的名称是A.B,那么它表示一个包A中子模块B

    • 包就是一个含有__ init__.py文件的文件夹

      __ init __ .py : 导入包就是导__ init __

    2.为什么要用包

    • 包的本质就是一个文件夹,用来对内部模块进行组织管理,从而达到提高程序的结构性和可维护性。

    3.如何用包

    • 包的导入

      • 绝对导入

        以执行文件路径为准,在执行文件中添加包所在的模块(文件夹)路径,然后就可以在__ init __.py中添加导入语句

        # 执行文件
        import sys
        sys.path.append(r'包与执行文件共同所在文件夹路径')
        ​
        import 包名
        ​
        包名.函数名()
            .
            .
            .
            
        #  包下的__  init _.py文件(存放调用命令)
        from 包名.文件名…… import 函数名……
        ……
         
      • 相对导入(仅限于包内文件相互引用)

        from . import 函数名、……

        '.':表示当前文件所在文件夹,再加一个点'.'则表示上一级文件夹,依次往上,不能超出包。

        注意:绝对导入是通用的,相对导入只能在包内使用


     

    内置模块

    1.json与pickle模块

    • 解决序列化的问题(Json:字符串;pickle:bytes)

    • 什么是序列化

      序列化就是将内存中的数据类型转成另一种格式

      即:

      序列化:字典————序列化————其他格式————存到硬盘

      反序列化:硬盘————读取————读取——其他格式————反序列化————字典

    • 为什么要序列化

      1. 将程序运行的数据序列化后永久保存到硬盘

      2. 数据的跨平台交互

      • 如何序列化

        • Json:

          优点:这种格式是一种通用格式,所有的编程语言都能识别

          缺点:不能识别所有python类型

          强调:json格式只有双引号,不能识别单引号

          • json.dumps:将 Python 对象编码成 JSON 字符串,序列化

          • json.loads:将已编码的 JSON 字符串解码为 Python 对象,反序列化

          

      • import json
        ​
        dic1 = {'k1': 'value', 'k2': 'v2', 'k3': 'v3', 'k4': '你好啊'}
        dic_j = json.dumps(dic1)  # 序列化
        ​
        with open(r'js.json', 'w', encoding='utf-8') as f1:
            json.dump(dic1, f1)  # 序列化+持久化(即保存下来)
        ​
        ​
        with open('js.json', mode='rt', encoding='utf-8') as f:
            dic_j=f.read()  # 将文件读到内存
        dic2 = json.loads(dic_j)  # 在内存中反序列化
        ​
        with open(r'js.json', 'r', encoding='utf-8') as f:
            print(json.load(f))  # 直接在文件中反序列化
            
        # dumps和loads方法都在内存中转换,dump和load的方法会多一个步骤,dump是把序列化后的字符串写到一个文件中,而load是从一个一个文件中读取文件

          json将中文转为Unicode16进制

      • pickle

        优点:能识别所有python类型

        缺点:只能别python这种编程语言识别

        序列化:pickle.dumps() pickle.dump

        反序列化:pickle.loads pickle.load

        # dumps
        dic_pkl=pickle.dumps({1,2,3,4})  # 序列化
        print(dic_pkl)
        ​
        with open('b.pkl',mode='wb') as f:  # 注意文件模式为B模式
            f.write(dic_pkl) # 保存(持久化)
            
        # dump
        with open('c.pkl',mode='wb') as f:
             pickle.dump(dic,f) # 序列化写入文件
             
        # loads
        with open('b.pkl',mode='rb') as f:
            s_pkl=f.read()  # 读取到内存
            s=pickle.loads(s_pkl)  # 反序列化
            print(type(s))
            
        # load
        with open('c.pkl',mode='rb') as f:
            dic=pickle.load(f)  # 在文件中反序列化
            print(dic,type(dic))

    2.time & date time

    • time

      时间分为三种格式

    1. 时间戳(从1970.1.1 00:00到当前的时间秒数)

      print(time.time())

    2. 格式化的字符串时间表

      print(time.strftime('%Y-%m-%d %H:%M:%S %p')) # 得到年-月-日 时-分-秒 上下午

    3. 结构化的时间

      print(time.localtime()) # 展示时间

      print(time.localtime().tm_mday) # 展示month day 今天是这个月的第几天

    1. 时间的转换

     

     

      

    • data time  

    #时间加减
    import datetime
    ​
    print(datetime.datetime.now()) # 返回当前时间

    print(datetime.date.fromtimestamp(time.time()) ) # 时间戳直接转成日期格式 2018-12-05 print(datetime.datetime.now() ) print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天 print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天 print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时 print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分 ​ c_time = datetime.datetime.now() print(c_time.replace(minute=3,hour=2)) #时间替换,替换当前时间的时和分比如2018-12-05 19:00:00 pm替换为2018-12-05 02:03:00 pm

    3.random 模块(随机数)

    import random
     
    print(random.random())  # 大于0且小于1之间的小数
     
    print(random.randint(1,3))  #[1,3]大于等于1且小于等于3之间的整数
     
    print(random.randrange(1,3)) #[1,3)大于等于1且小于3之间的整数
     
    print(random.choice([1,'23',[4,5]]))  #1或者23或者[4,5]
     
    print(random.sample([1,'23',[4,5]],2))  #列表元素任意2个组合
     
    print(random.uniform(1,3))  #大于1小于3的小数,如1.927109612082716 
     
     
    item=[1,3,5,7,9]
    random.shuffle(item) # 随机打乱item的顺序,相当于"洗牌"
    print(item)

     

    # 编写一个随机验证码生成器,要求验证码由字母与数字组成
    import random
    ​
    def test(digit_size): # digit_size 自定义验证码位数
        res = ''
        for i in range(digit_size): 
            num = str(random.randint(0, 9))  # 随机数字
            u_alp = chr(random.randint(65, 90)) # 随机大写字母,chr(ASCII小写字符对应数字)
            l_alp = chr(random.randint(97, 122)) # 随机小写字母
            res += random.choice([num, u_alp, l_alp]) # 随机三种格式之一,并实现字符串的拼接
        return res
    ​
    i_digit_size = input('请输入随机验证码位数:')
    print(test(i_digit_size))
     
  • 相关阅读:
    Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)
    树的遍历(前序中序求后序,后序中序求前序)
    Codeforces Round #439 (Div. 2)
    python3 调用百度api实现语音识别
    Win10 opencv cuda + 扩展库 vs2019 cuda10
    flask读取摄像头并实时显示
    树莓派设置开机启动
    树莓派python OLED使用
    UART Fingerprint Sensor (C)树莓派使用
    树莓派全版本换源(多环境测试无误版)
  • 原文地址:https://www.cnblogs.com/liusijun113/p/10072996.html
Copyright © 2011-2022 走看看