zoukankan      html  css  js  c++  java
  • os模块 sys模块 json/pickle 模块 logging模块

    模块

    1. os模块

    • os模块有什么用

      与操作系统交互,控制文件/文件夹

    • # 对文件操作
      import os
      ## 判断是否为文件
      res = os.path.isfile(r'D:上海python12期视频python12期视频day 160 上节课回顾.md')
      print(res)
      
      ## 删除文件
      # os.remove(r'')
      
      ## 重名名文件
      # os.rename(r'', r'')
      
      # 对文件夹操作
      
      ## 判断是否为文件夹
      # os.path.isdir()
      
      ## 创建文件夹
      if not os.path.exists(r'D:上海python12期视频python12期视频	est'):
          os.mkdir(r'D:上海python12期视频python12期视频	est')
      
      ## 删除文件夹
      os.rmdir(r'D:上海python12期视频python12期视频	est')
      
      ## 列出文件夹内所有的文件(*****)
      res = os.listdir(r'D:上海python12期视频python12期视频day 16')
      print(res)
      
      # 辅助性的
      
      ## 当前文件的所在文件夹
      res = os.getcwd()
      print(res)
      
      ## 当前文件所在的具体路径
      ## __file__ pycharm独有
      print('__file__:', __file__)
      res = os.path.abspath(__file__)  # 根据不同的操作系统,更换不同的或/
      print(res)
      
      ## 文件的文件夹
      
      res = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
      print(res)
      
      ## 拼接文件路径
      res = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'img', 'test.jpg')
      print(res)
      
      ## 判断路径是否存在(文件or文件夹都适用)
      res = os.path.exists(r'D:上海python12期视频python12期视频day 161 os模块.py')
      print(res)
      
      # 尽量不要写路径
      
      
      
      ## 代码统计(只是想告诉你os模块的应用场景)
      def count_code(file_path):
          """通过文件路径计算文件代码量"""
          count = 0
          # tag = False
          # tag2 = False
          with open(file_path, 'r', encoding='utf8') as fr:
              for i in fr:
                  if i.startswith('#'):
                      continue
                  if i.startswith('
      '):
                  count += 1
          # 计算代码量
          return count
      
      
      def count_all_file_code(top):
          if os.path.isfile(top):
              count = count_code(top)
              return count
      
          # 针对文件夹做处理
          res = os.walk(top)  # 只针对文件夹
          count_sum = 0
          for dir, _, files in res:
              # print(i) # 所有文件夹名
              # print(l) # i文件夹下对应的所有文件名
              for file in files:
                  file_path = os.path.join(dir, file)
                  if file_path.endswith('py'):  # 判断是否为py文件
                      count = count_code(file_path)
                      count_sum += count
          return count_sum
      
      
      top = r'D:上海python12期视频python12期视频项目-atm'
      count_sum = count_all_file_code(top)
      print(f' {top} 代码量统计: {count_sum}')
      

    2. sys模块

    • sys模块的作用

      与python解释器交互

    import sys
    
    ## 最常用,当使用命令行式运行文件,接收多余的参数
    res = sys.argv
    print(res)
    # print(1)
    # print(res[1])
    
    
    #
    import requests
    
    
    # 拿到当前导入的模块
    print(sys.modules.keys())
    
    
    
    # requests = __import__('requests')
    
    
    # 了解
    print(sys.api_version)
    
    print(sys.copyright)
    
    print(sys.version)
    
    print(sys.hexversion)
    
    

    3. json和pickle模块

    • json的作用

      跨平台数据交互,json串,但python中的集合在json中没有对应的转化

    • pickle模块

      不跨平台,针对python所有数据类型(如集合)使用

    序列化: 按照特定的规则排列(json串-->跨平台交互,传输数据)
    反序列化: 按照特定的规则把json串转换成python/java/c/php需要的数据类型
    
    # json 实例
    import json
    
    dic = [1, (1, 2)]
    
    res = json.dumps(dic)  # json串中没有单引号,
    print(type(res), res)  # 跨平台数据交互
    
    res = json.loads(res)
    print(type(res), res)
    
    # (********)
    # dic = {'a': True, 'b': None}
    
    # # # 序列化字典为json串,并保存文件
    # import json
    # def dic():
    #     print('func')
    # with open('test.json', 'w', encoding='utf8') as fw:
    #     json.dump(dic, fw)
    #
    # # 反序列化
    # with open('test.json', 'r', encoding='utf8') as fr:
    #     data = json.load(fr)
    #     print(type(data), data)
    
    # goods = {
    #     1: 'wawa',
    # }
    #
    # with open('nick.json', 'r', encoding='utf8') as fr:
    #     data = json.load(fr)
    #     data['wawa'] = 1
    #     data['extra'] -= 10
    #     data['locked'] = 1
    # with open('nick.json', 'w', encoding='utf8') as fw:
    #     json.dump(data, fw)
    
    # pickle 实例
    import pickle  # -->未来存对象(存对象名,)
    
    
    # def func():  # 针对地址而言,只存了一个函数名
    #     print('func')
    
    # with open('test.pkl','wb') as fw:
    #     pickle.dump(func,fw)
    
    
    def func():
        print('lksjdfkljskldfjlksjdlk')
    
    
    with open('test.pkl', 'rb') as fr:
        data = pickle.load(fr)
        print(type(data), data)
        data()  # func()
    

    4. logging模块

    • logging 模块的作用

      就是记录日志

    (1)日志配置

    import logging
    
    # 日志级别(如果不设置,默认显示30以上)
    # v1
    # logging.info('info')  # 10
    # logging.debug('debug')  # 20
    # logging.warning('wraning')  # 30
    # logging.error('error')  # 40
    # logging.critical('critical')  # 50
    
    
    # v2 --> 添加设置
    
    # logging.basicConfig(filename='20190927.log',
    #                     format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
    #                     datefmt='%Y-%m-%d %H:%M:%S %p',
    #                     level=10)
    #
    # username = 'nick'
    # goods = 'bianxingjingang'
    # logging.info(f'{username}购物{goods}成功')  # 10
    
    
    # v3: 自定义配置
    
    
    # 1. 配置logger对象
    nick_logger = logging.Logger('nick')
    json_logger = logging.Logger('jason')
    
    # 2. 配置格式
    formmater1 = logging.Formatter('%(asctime)s - %(name)s -%(thread)d - %(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. 配置handler --> 往文件打印or往终端打印
    h1 = logging.FileHandler('nick.log')
    h2 = logging.FileHandler('json.log')
    sm = logging.StreamHandler()
    
    # 4. 给handler配置格式
    h1.setFormatter(formmater1)
    h2.setFormatter(formmater2)
    sm.setFormatter(formmater3)
    
    # 5. 把handler绑定给logger对象
    nick_logger.addHandler(h1)
    nick_logger.addHandler(sm)
    json_logger.addHandler(h2)
    
    # 6. 直接使用
    nick_logger.info(f'nick 购买 变形金刚 4个')
    # json_logger.info(f'json 购买 变形金刚 10个')
    
    

    (2)实际开发中日志的使用

    
    
    # 记住以上可以全部忘记,在实际开发中只要会下面的cv大法,只需要根据注释内容,按自己的需求自定义日志保存路径等内容即可
    
    # settings文件中复制粘贴下面的内容:
    *******************************************************************
    # 定义三种日志输出格式 开始
    standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
                      '[%(levelname)s][%(message)s]'  # 其中name为getLogger()指定的名字;lineno为调用日志输出函数的语句所在的代码行
    simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
    # 定义日志输出格式 结束
    
    logfile_dir = base_path  # log文件的目录,需要自定义文件路径 # atm
    logfile_dir = os.path.join(logfile_dir, 'log')  # C:UsersoldboyDesktopatmlog
    
    logfile_name = 'atmlog.log'  # log文件名,需要自定义路径名
    
    # 如果不存在定义的日志目录就创建一个
    if not os.path.isdir(logfile_dir):  # C:UsersoldboyDesktopatmlog
        os.mkdir(logfile_dir)
    
    # log文件的全路径
    logfile_path = os.path.join(logfile_dir, logfile_name)  # C:UsersoldboyDesktopatmloglog.log
    # 定义日志路径 结束
    
    # log配置字典
    LOGGING_DIC = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'standard': {
                'format': standard_format
            },
            'simple': {
                'format': simple_format
            },
        },
        'filters': {},  # filter可以不定义
        'handlers': {
            # 打印到终端的日志
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',  # 打印到屏幕
                'formatter': 'simple'
            },
            # 打印到文件的日志,收集info及以上的日志
            'default': {
                'level': 'INFO',
                'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
                'formatter': 'standard',
                'filename': logfile_path,  # 日志文件
                'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M  (*****)
                'backupCount': 5,
                'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
            },
        },
        'loggers': {
            # logging.getLogger(__name__)拿到的logger配置。如果''设置为固定值logger1,则下次导入必须设置成logging.getLogger('logger1')
            '': {
                # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'handlers': ['default', 'console'],
                'level': 'DEBUG',
                'propagate': False,  # 向上(更高level的logger)传递
            },
        },
    }
    ************************************************************
    # 在后端的公用方法中书写下面的内容即可。
    import logging.config
    def get_log(name):
        logging.config.dictConfig(setting.LOGGING_DIC)
        logger = logging.getLogger(name)
        return logger
    
    # 在程序需要记录日志等的地方使用即可
    
    logger = common.get_log('要记录内容')
    
    
  • 相关阅读:
    Android OpenGL ES 2.0 (四) 灯光perfragment lighting
    Android OpenGL ES 2.0 (五) 添加材质
    冒泡排序函数
    javascript object 转换为 json格式 toJSONString
    Liunx CentOS 下载地址
    jquery 图片切换特效 鼠标点击左右按钮焦点图切换滚动
    javascript 解析csv 的function
    mysql Innodb Shutdown completed; log sequence number解决办法
    Centos 添加 yum
    javascript 键值转换
  • 原文地址:https://www.cnblogs.com/Mcoming/p/11599601.html
Copyright © 2011-2022 走看看