zoukankan      html  css  js  c++  java
  • 包与一些常见模块

    之前我们讲到了模块,但是如果一个模块里的函数过多的话,会显得比较麻烦。如果将它直接分为多个文件,不仅会改变导入的方式,而且会对使用者造成不小的麻烦,毕竟不同的函数在不同的文件里,难道还要使用者一个一个找不成?这个时候包的用法就出现了

    什么是包?包就是把一个模块分成多个文件,并且导入方式相同,用了包之后还是from m1 import f1, 使用者感觉不到变化

    包本质上就是一个文件夹,但是其中必须拥有__init__这个文件。换句话说,__init__让一个普通的文件夹成为一个包,导包就是导inti

    使用的第一种方式

    from m1 import f1
    
    from m1 import *  # 运行init这个文件,创建一个init这个名称空间,然后把inti内的变量丢入 init 这个名称空间内
    
    f1()  # 导包以执行文件的环境变量为基准
    f2()
    f3()
    f4()
    # import sys
    # print(sys.path)
    
    import requests
    
    
    from m1 import f1()
    from m1 import f7
    
    f7()
    

    这种方式虽然可行但是不推荐使用

    导包就是导入init

    包的文件以执行文件的环境变量为基准,包的init只能从包名开始导入

    相对导入: (只能在包中使用)

    .是当前目录
    ..是父目录

    random模块

    较常用的方法

    print(random.random())  # 0-1的随机数
    
    print(random.randint(0, 100))  # 0-100的整数
    
    lt = [1, 2, 3, 4, 5,]
    random.shuffle(lt)  # 打乱容器类元素  --> 列表和字典
    print(lt)
    

    了解的方法

    print(random.randrange(1, 10))  # 1,9之内的整数
    
    print(random.uniform(1, 3))  # 1-3的小数
    
    print(random.choice([1, 2, 3, 'a', 'b']))  # 选一个
    
    print(random.sample([1, 2, 3, 'a', 'b'],2))  # 选2个
    
    
    def choice(lt):
    
        ind = random.randint(0,len(lt)-1)
    
        return lt[ind]
    
    print(choice([1, 2, 3, 'a', 'b']))
    
    
    # time模块
    
    ## 时间戳
    
    

    print(time.time()) # 1565958257.9459026

    
    这是1970年到现在的时间
    
    但是这样子看时间会很麻烦
    
    ## 格式化时间
    
    

    year month day X

    print(time.strftime('%Y_%m_%d %X')) # 2019_08_16 10:26:36

    
    这样就舒服多了
    
    ## 结构化时间
    
    

    print(time.localtime()) # 当地时间(中国)
    print(time.gmtime()) # 标准时间

    
    ## 三种格式化时间的转换
    
    

    结构化时间转格式化时间

    print(time.strftime('%Y-%m-%d %X', time.localtime()))

    格式化时间转结构化时间

    print(time.strptime('2019-08-16 10:30:44', '%Y-%m-%d %X'))

    
    

    结构化时间转时间戳

    print(time.mktime(time.localtime()))

    时间戳转结构化时间

    print(time.localtime(time.time()))

    
    ## 重点
    
    

    time.time()
    time.sleep(2)

    
    # datetime模块
    
    

    import datetime

    print(datetime.datetime.now()) # 打印时间

    now = datetime.datetime.now()

    print(now+datetime.timedelta(3)) # 默认+3天

    print(now+datetime.timedelta(hours=3)) # 3小时
    print(now+datetime.timedelta(minutes=3)) # 3分钟

    print(now.replace(year=1900))

    
    # os模块
    
    

    mport os

    print(os.getcwd()) # 获取当前文件目录

    os.mkdir('m2') # 创建一个文件夹
    os.rmdir('m2') # 删除文件夹

    
    

    res = os.listdir(r'D:上海Python11期视频python11期视频day 17') # 列出所有文件
    print(res)

    os.rename('test.py','test1.py')
    os.remove('test1.py')

    
    \__file__只有pycharm才提供,python本身不支持
    
    

    print('os.path.abspath(file):',os.path.abspath(file)) # 支持不同的平台(windows,ios,andirod,linux,unix)

    rint(os.path.exists('01 包.py')) # 文件不存在False,存在True

    
    

    print(os.path.exists('01 包.py')) # 文件不存在False,存在True

    print(os.path.isfile('01 包.py')) # 是否为文件
    print(os.path.isdir('01 包.py')) # 是否为文件夹

    
    

    ********(经常使用)

    支持不同的平台(windows,ios,andirod,linux,unix)

    res = os.path.join(r'D:上海Python11期视频python11期视频day 17m1bb','m5.py') # 拼接文件路径
    res = os.path.join(r'D:上海Python11期视频python11期视频day 17m1bb','m5','test.py') # 拼接文件路径

    print(r'D:上海Python11期视频python11期视频day 17m1b'+'m5.py')

    print(res)

    ******* (经常使用)

    print(os.path.abspath(file))
    print(os.path.dirname(os.path.dirname(os.path.abspath(file))))

    
    

    import os
    g = os.walk(r'D:上海Python11期视频python11期视频day 17') # 返回三个值,第一个值是路径;第二个值是路径下的文件夹,第三个值是路径下的文件
    for i in g:
    print(i)

    
    # sys模块
    
    

    sys模块: 与Python解释器交互

    import sys

    print(sys.path) # 路径

    print(sys.argv) # 接收参数(用cmd执行文件时运行才有效)

    print(sys.modules)

    
    # json
    
    

    json模块:

    用python写了一个程序,用java写了一门程序,这两个程序需要数据之间交流,规定了一种多种语言通用的数据类型,json串

    序列化:从python的字典(最常用)变成json串, dump

    反序列化:从json串变成python的字典(最常用),load

    import json

    dic = {'a': 1, 'b': 'abc', 'c': None}
    data = json.dumps(dic) # 序列化到内存中
    print(data,type(data)) # 单引号全部变成双引号
    data = json.loads(data) # 从内存中获取json串
    print(data,type(data))

    with open('test.json','w',encoding='utf8') as fw:
    json.dump(dic,fw)

    with open(f'{"test"}.json','r',encoding='utf8') as fr:
    data = json.load(fr)
    print(data)

    
    # pickle模块
    
    方法类似于json但是当进行反序列化的时候,pickle的执行文件导出函数时,只能导出该执行文件里的同名函数,因为pickle存放函数是只存放了地址,并没有存放该函数的值
    
    

    文件1

    def func():
    x = 3
    print(x)

    import pickle
    with open('test.pkl','wb') as fw:
    pickle.dump(func,fw)

    文件2

    with open('test.pkl', 'rb') as fr:
    data = pickle.load(fr)
    data()
    print(data)

    
    如上述代码,如果运行文件2则会报错,因为文件2里没有定义函数func(),即使定义了也只会显示在该文件里定义的函数
    
    也就是说,**pickle的函数反序列化是没用的**
    
    # hashlib模块
    
    一般用于密码的保密
    
    

    import hashlib

    m = hashlib.md5() # 固定的写法
    m.update(b'123456')

    m.update(b'456')

    print(m.hexdigest())

    
    hash后的特点:
    
    1. 变成固定的字符串
    2. 相同的字符串哈希后结果一样
    3. 叠加性
    
    # hmac模块
    
    

    import hmac

    m = hmac.new(b'abc') # 加盐
    m.update(b'123456')

    m.update(b'456')

    print(m.hexdigest())

    
    方法类似于hashlib,只是管理者可以设定一个key值,更难被破译
    
    # logging模块
    
    一般logging模块都是套用模板,这里就不详细说了
    
    

    mport logging

    logging.debug('调试') # 10

    logging.info('正常') # 20 # 用这一个

    logging.critical('严重错误') # 30

    logging.error('错误') # 40

    logging.warning('警告') # 50

    默认30以上的可以输出

    v2 日志信息记录在文件当中

    logging.basicConfig(filename='access.log',

    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',

    datefmt='%Y-%m-%d %H:%M:%S %p',

    level=10)

    logging.debug('调试信息') # 10

    logging.info('正常信息') # 20

    logging.warning('警告信息') # 30

    logging.error('报错信息') # 40

    logging.critical('严重错误信息') # 50

    1. 生成一个logger对象

    logger = logging.getLogger('hyc')

    2. 生成格式

    formmater1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S %p',)
    formmater2 = logging.Formatter('%(asctime)s : %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S %p',)
    formmater3 = logging.Formatter('%(name)s %(message)s',)

    3. 生成一个文件对象

    h1 = logging.FileHandler('h1.log')
    h2 = logging.FileHandler('h2.log')
    sm = logging.StreamHandler()

    4. 文件绑定格式

    h1.setFormatter(formmater1)
    h2.setFormatter(formmater2)
    sm.setFormatter(formmater3)

    5. 绑定文件

    logger.addHandler(h1)
    logger.addHandler(h2)
    logger.addHandler(sm)

    6. 控制级别

    logger.level = 50

    7. 使用

    logger.debug('调试信息') # 10
    logger.info('正常信息') # 20
    logger.warning('警告信息') # 30
    logger.error('报错信息') # 40
    logger.critical('严重错误信息') # 50

  • 相关阅读:
    解决SharePoint 文档库itemadded eventhandler导致的上传完成后,编辑页面保持报错的问题,错误信息为“该文档已经被编辑过 the file has been modified by...”
    解决SharePoint 2013 designer workflow 在发布的报错“负载平衡没有设置”The workflow files were saved but cannot be run.
    随机实例,随机值
    Spring4笔记
    struts2笔记(3)
    struts2笔记(2)
    获取文本的编码类型(from logparse)
    FileUtil(from logparser)
    DateUtil(SimpleDateFormat)
    struts2笔记
  • 原文地址:https://www.cnblogs.com/hyc123/p/11366497.html
Copyright © 2011-2022 走看看