zoukankan      html  css  js  c++  java
  • shutil模块,shevle与xml模块,configerparser模块,logging模块

    一、shutil模块

    高级的 文件、文件夹、压缩包 处理模块

    1、shutil.copyfileobj(fsrc, fdst[, length])  将文件内容拷贝到另一个文件中

    2、shutil.copyfile(src, dst) 拷贝文件

    3、shutil.copymode(src, dst) 仅拷贝权限。内容、组、用户均不变
    4、shutil.copystat(src, dst) 仅拷贝状态的信息,包括:mode bits, atime, mtime, flags
    5、shutil.copy(src, dst)拷贝文件和权限
    6、shutil.copy2(src, dst)拷贝文件和状态信息
    7、shutil.ignore_patterns(*patterns)
      shutil.copytree(src, dst, symlinks=False, ignore=None) 递归的去拷贝文件夹
    8、shutil.rmtree(path[, ignore_errors[, onerror]])递归的去删除文件

    import shutil
    #递归的去移动文件,它类似mv命令,其实就是重命名。
    #shutil.move(src, dst)
     shutil.move('aaa','eee')
     shutil.move('aaa','bbb')
    
    压缩
    import shutil
     ret = shutil.make_archive("xxx", 'gztar', root_dir=r'D:python全栈15期day22')
     print(ret)
    
    压缩
    import shutil
     ret = shutil.make_archive("bbb_bak", 'gztar', root_dir=r'D:python全栈15期day22bb')
    
    解压缩
     import tarfile
    
     t=tarfile.open('bbb_bak.tar.gz','r')
     t.extractall('.')
    t.close()

    二、shevle与xml模块

     1、shelve模块(序列化)比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型

            但局限性很强

    import shelve
    
    f=shelve.open('db.shl')
    
    # f['info']={"name":"egon","age":18}
    
    print(f['info']['name'])
    
    f.close()

    2、xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,清晰,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。

    三、configerparser模块(*****)

     专业解析某种配置文件

    之前我们学的settings.py配置文件low,不专业。

    碰到:.ini   .cfg  .cnf结尾的配置文件,一般解析都是用此模块

    # 注释1
    ; 注释2
    
    [section1]
    k1 = v1
    k2:v2
    user=egon
    age=18
    is_admin=true
    salary=31
    
    [section2]
    k1 = v1

    读取:

    import configparser
    
    config=configparser.ConfigParser()
    config.read('a.cfg')
    
    #查看所有的标题
    res=config.sections() #['section1', 'section2']
    print(res)
    
    #查看标题section1下所有key=value的key
    options=config.options('section1')
    print(options) #['k1', 'k2', 'user', 'age', 'is_admin', 'salary']
    
    #查看标题section1下所有key=value的(key,value)格式
    item_list=config.items('section1')
    print(item_list) #[('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')]
    
    #查看标题section1下user的值=>字符串格式
    val=config.get('section1','user')
    print(val) #egon
    
    #查看标题section1下age的值=>整数格式
    val1=config.getint('section1','age')
    print(val1) #18
    
    #查看标题section1下is_admin的值=>布尔值格式
    val2=config.getboolean('section1','is_admin')
    print(val2) #True
    
    #查看标题section1下salary的值=>浮点型格式
    val3=config.getfloat('section1','salary')
    print(val3) #31.0

    改写(了解):一般人不会改,除非运维人员会修改

    import configparser
    
    config=configparser.ConfigParser()
    config.read('a.cfg',encoding='utf-8')
    
    
    #删除整个标题section2
    config.remove_section('section2')
    
    #删除标题section1下的某个k1和k2
    config.remove_option('section1','k1')
    config.remove_option('section1','k2')
    
    #判断是否存在某个标题
    print(config.has_section('section1'))
    
    #判断标题section1下是否有user
    print(config.has_option('section1',''))
    
    
    #添加一个标题
    config.add_section('egon')
    
    #在标题egon下添加name=egon,age=18的配置
    config.set('egon','name','egon')
    config.set('egon','age',18) #报错,必须是字符串
    
    
    #最后将修改的内容写入文件,完成最终的修改
    config.write(open('a.cfg','w'))

    四、logging模块

     1、日志级别

    CRITICAL = 50 #FATAL = CRITICAL
    ERROR = 40
    WARNING = 30 #WARN = WARNING
    INFO = 20
    DEBUG = 10
    NOTSET = 0 #不设置

    2、默认级别为warning,默认打印到终端

    import logging
    
    logging.debug('调试debug')
    logging.info('消息info')
    logging.warning('警告warn')
    logging.error('错误error')
    logging.critical('严重critical')
    
    '''
    WARNING:root:警告warn
    ERROR:root:错误error
    CRITICAL:root:严重critical

    3、记住

    import logging
    
    # # 一:日志配置
    # logging.basicConfig(
    #     # 1、日志输出位置:1、终端 2、文件
    #     filename='access.log', # 不指定,默认打印到终端
    #
    #     # 2、日志格式
    #     format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
    #
    #     # 3、时间格式
    #     datefmt='%Y-%m-%d %H:%M:%S %p',
    #
    #     # 4、日志级别
    #     # critical => 50
    #     # error => 40
    #     # warning => 30
    #     # info => 20
    #     # debug => 10
    #     level=30,
    # )
    #
    # logging.debug('1111')
    # logging.info('2222')
    # logging.warning('33333')
    # logging.error('4444')
    # logging.critical('5555')
    #
    
    # 二:日志配置字典
    import logging.config
    import settings
    
    logging.config.dictConfig(settings.LOGGING_DIC)
    
    # logger1=logging.getLogger('用户交易')
    
    # logger1.info("egon给alex转了三个亿")
    
    # logger2=logging.getLogger('xxx')
    # logger2.info("egon给lqz转了三个亿")
    
    
    logger3=logging.getLogger('yyy')
    logger3.info("egon给刘玉转了三个亿")

    4、使用

    import settings
    
    # !!!强调!!!
    # 1、logging是一个包,需要使用其下的config、getLogger,可以如下导入
    # from logging import config
    # from logging import getLogger
    
    # 2、也可以使用如下导入
    import logging.config # 这样连同logging.getLogger都一起导入了,然后使用前缀logging.config.
    
    # 3、加载配置
    logging.config.dictConfig(settings.LOGGING_DIC)
    
    # 4、输出日志
    logger1=logging.getLogger('用户交易')
    logger1.info('egon儿子alex转账3亿')
    
    # logger2=logging.getLogger('专门的采集') # 名字传入的必须是'专门的采集',与LOGGING_DIC中的配置唯一对应
    # logger2.debug('专门采集的日志'

    5、记住

    #logger:产生日志的对象
    
    #Filter:过滤日志的对象
    
    #Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端
    
    #Formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式
  • 相关阅读:
    只有标题1没有标题2、3的解决方法
    python函数学习总结
    python基础知识学习总结
    StructuredStreaming中,如果trigger触发时前一批数据还没处理完怎么办?
    StructuredStreaming解析JSON CVS
    StructuredStreaming整合kafka
    kafka--如何选择Kafka的分区数和消费者个数
    kafka中groupid作用
    查看kafka版本
    spark项目java与scala相互调用打包
  • 原文地址:https://www.cnblogs.com/guojieying/p/13420333.html
Copyright © 2011-2022 走看看