zoukankan      html  css  js  c++  java
  • Python—day18 dandom、shutil、shelve、系统标准流、logging

    一、dandom模块

    (0, 1) 小数:random.random()
    [1, 10] 整数:random.randint(1, 10)
    [1, 10) 整数:random.randrange(1, 10)
    (1, 10) 小数:random.uniform(1, 10)
    单例集合随机选择1个:random.choice(item)
    单例集合随机选择n个:random.sample(item, n)
    

      

    import  random
    # print(random.random())
    # print(random.randint(1, 10))
    # print(random.randrange(1, 10))
    # print(random.uniform(1, 10))
    
    print(random.choice('abc'))
    print(random.sample({1,2,3,4,5},3))  # 输出结果:以列表形式输出[1, 3, 4]
    
    ls=[1,2,3,4,5]
    random.shuffle(ls)
    print(ls)
    案例:设计验证码
    def
    random_code(count): code='' for i in range(count): num=random.choice([1,2,3]) if num==1: # 自己设置 可以设置为数字 code+=str(random.randint(0,9)) # 转成字符串,通过列表一个一个传然后在转成字符串输出 elif num==2: # 可以设置为大写字母 code+=chr(random.randint(65,90)) #通过ASCII码查找大写字母 else: code += chr(random.randint(97, 122)) #通过ASCII码查找小写字母 return code print(random_code(6)) # 简化版: def random_code1(count): source='ABCDEFabcdef0123456789' code_list=random.sample(source,count) return ''.join(code_list) print(random_code1(6))
    二、shutil模块
    import shutil
    
    
    # 1、 基于路径的文件复制:
    shutil.copyfile('source_file', 'target_file')
    
    # 2、 基于流的文件复制:
    with open('a.py', 'rb') as r, open('b.py', 'wb') as w:
        shutil.copyfileobj(r, w)
    
    #3、 递归删除目标目录
    shutil.rmtree('target_folder')
    
    # 4、文件移动
    shutil.move('a/a.py', 'b/a.py')#  可以从文件夹移动到另一个文件夹
    shutil.move('a/a.py', 'b/b.py') #  可以从文件夹移动到另一个文件夹并可以移动时重命名
    
    # 5、文件夹压缩
    shutil.make_archive('file_name', 'format', 'archive_path')
    # 不写路径地址,会将当前根目录文件夹下所有目录压缩  gztar、zip两种压缩解压缩方式
    
    # 6、文件夹解压
    shutil.unpack_archive('archive_path:解压的文件路径', 'file_name:解压到的文件名', 'format:解压方式')

    三、shelve模块
    # shevle:可以用字典存取数据到文件的序列化模块
    
    # 将序列化文件操作dump与load进行封装
    s_dic = shelve.open("target_file", writeback=True)  # 注:writeback允许序列化的可变类型,可以直接修改值
    # 序列化::存
    s_dic['key1'] = 'value1'
    s_dic['key2'] = 'value2'
    # 反序列化:取
    print(s_dic['key1'])
    # 文件这样的释放
    s_dic.close()
    import shelve
    
    # 将序列化文件操作dump与load进行封装
    s_dic=shelve.open('t.txt') # writeback=True 时操作的数据会同步写到文件中
    
    # 序列化:存
    s_dic['key1']=[1,2,3,4,5]
    s_dic['key2']={'name':'abc','age':18}
    s_dic['key3']='abc'
    s_dic.close() # 文件释放
    #
    s_dic=shelve.open('t.txt',writeback=True)
    print(s_dic['key1'])
    s_dic['key1'][2]=30  # 将key1中的第三个数改为30
    print(s_dic['key1'])  # 输出结果:[1, 2, 3, 4, 5]   [1, 2, 30, 4, 5]
    
    print(s_dic['key2'])
    s_dic['key2']['age']=300  # 将key2中的age数改为300
    print(s_dic['key2'])  # 输出结果:{'name': 'abc', 'age': 18}   {'name': 'abc', 'age': 300}
    
    
    print(s_dic['key3'])
    s_dic['key3']='defg' # 将key3将abc改为defg的几个字符串
    print(s_dic['key3'])
    s_dic.close()
    
    from  shelve import  DbfilenameShelf
    res=shelve.open('t.txt')
    print(res,type(res))
    #输出结果: shelve.DbfilenameShelf object at 0x00000247CD0EB320> <class 'shelve.DbfilenameShelf'>



    四、系统标准流(流入、流出、信息错误流)
    #  指:系统标准输入流|输出流|错误流
    
    sys.stdout.write('msg')
    sys.stderr.write('msg')
    msg = sys.stdin.readline()
    
    # print默认是对sys.stdout.write('msg') + sys.stdout.write('
    ')的封装
    # 格式化结束符print:print('msg', end='')
    # 1、标准输出流
    import sys
    sys.stdout.write('123')  # 相当于print('msg',end=)
    sys.stdout.write('123
    ') # 相当于==print()
    
    
    
    print('abc',end='')
    # 输出结果123123
    #         abc
    print('abc',end='')
    # 输出结果   123123
    #            abcabc
    
    
    # 2、 标准错误流
    sys.stderr.write('错误信息
    ')
    sys.stderr.write('错误信息')
    sys.stderr.write('错误信息')
    #输出结果: 错误信息          (第一个换行了,所以到第二行才显示)
    #           错误信息错误信息
    
    # 3、系统标准输入流
    res=sys.stdin.read(3)
    print(res)  # 输出的结果:不管输入多少输出都被限制为3位
    res=sys.stdin.readline()
    print(res)  # 输出的结果:输入多行就输出多行,如加上上面的限制,则输出的一行变为多行,每行个数为3

    五、logging模块
    # logging 的日志可以分为debug()、info()、warning()、error()、critical() 5个级别
    
    
    
    1) root logging的基本使用:五个级别
    2)root logging的基本配置:logging.basicConfig()
    3)logging模块四个核心:Logger | Filter | Handler | Formater
    4)logging模块的配置与使用
       -- 配置文件:LOGGING_DIC = {}
       -- 加载配置文件:logging.config.dictConfig(LOGGING_DIC) => logging.getLogger('log_name')
    import  logging
    import sys
    
    handler1=logging.FileHandler("a.log",encoding='utf-8')
    handler2=logging.StreamHandler()
    
    logging.basicConfig(
        level = logging.DEBUG,
        # stream=sys.stdout, # 将打印出的红字变成白色的字
        format="%(asctime)s -【%(level name)s】:%(massage)s",
        # filename='a.log',
        handlers=[handler1,handler2])
    
    # 打印级别是人为规定的(现只能打印出最后三个。前两个级别比较低无法打印出来)
    logging.debug('debug')
    logging.info('info')
    # logging.warning('warning')
    # logging.error('error')
    # logging.fatal('fatal')  # ==logging.critical('critical')
    import logging
    
    # 规定输出源
    handler1 = logging.FileHandler("a.log", encoding="utf-8")
    handler2 = logging.StreamHandler()
    
    # 规定输出格式
    fmt=logging.Formatter(
        fmt="%(asctime)s-%(name)s-%(levelname)s:%(message)s",
        datefmt="%m-%d %H:%M:%S %p")
    
    o_log=logging.getLogger('abc')
    o_log.setLevel(10)   # 给logger设置打印级别
    o_log.addHandler(handler1) #设置输出源,可以多个
    o_log.addHandler(handler2)
    handler1.setFormatter(fmt) # 设置输出格式
    o_log.warning('abc message')
    
    o_log1=logging.getLogger('zxc')
    o_log1.setLevel(10)
    o_log1.addHandler(handler2)
    handler2.setFormatter(fmt)
    o_log1.warning('zxc message')







  • 相关阅读:
    [LeetCode]Word Break
    [LeetCode]singleNumber
    [LeetCode]Palindrome
    新浪博客无法访问
    C++基础之顺序容器
    C++基础之IO类
    [LeetCode]Restore IP Addresses
    [LeetCode]Maximal Rectangle
    [LeetCode]Reverse Linked List II
    ACM 树形数组
  • 原文地址:https://www.cnblogs.com/zhouqinmei/p/10692208.html
Copyright © 2011-2022 走看看