python之常用模块
1.logging模块
1.1logging模块的级别
debug 调试
info 记录
warning 潜在危险
error 报错
critical 严重的
1.2在文件中输出日志
import logging logging.basicConfig(filename='log.test.log', level=logging.INFO,#只有比设定的等级高或者和设定的等级一样才会显示⭐️⭐️ format='%(asctime)s%(message)s', datefmt='%yY-%m-%d%I:%M:%s%P') logging.info('My name is Gao hui') logging.debug('My name is hong yan') logging.warning('My name is Alex Li')
自定义日志格式的选项:
%(name)s | Logger的名字 |
%(levelno)s | 数字形式的日志级别 |
%(levelname)s | 文本形式的日志级别 |
%(pathname)s | 调用日志输出的函数的模块的完整路径名,可能没有 |
%(filename)s | 调用日志输出的函数的模块的文件名 |
%(module)s | 调用日志输出的函数的模块名 |
%(funcName)s | 调用日志输出的函数的函数名 |
%(lineno)d | 调用日志输出的函数的语句所在行的代码行 |
%(created)f | 当前时间,用UNIX标准的表示时间的浮点数来表示 |
%(relativeCreated)d | 输出日志信息时的,自Logger创建以来的毫秒数 |
%(asctime)s | 字符串形式的当前时间,默认格式是“2003-07-08 16:49:45,896”。逗号后面的是毫秒 |
%(thread)d | 线程id。可能没有 |
%(threadName)s | 线程名。可能没有 |
%(process)d | 进程id。可能没有 |
%(message)s | 用户输出的消息 |
1.3在文件和屏幕中同时输出日志
import logging #1.生成logger对象 logger = logging.getLogger("gao")#创建日志对象 logger.setLevel(logging.INFO) #设置全局等级 #2.生成hanlder console = logging.StreamHandler()#日志以屏幕形式输出 console.setLevel(logging.WARNING)#设置屏幕等级 #text = logging.FileHandler("gao.log")#日志以文件格式输出 text.setLevel(logging.WARNING)#设置文件等级 #2.1把handle对象绑定到logger logger.addHandler(console) logger.addHandler(text) #3.生成formatter对象 console_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s') file_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s') console.setFormatter(console_formatter) text.setFormatter(file_formatter) logger.warning("test1") logger.info("test2")
1.4用filter过滤
import logging from logging import handlers class IgnoreBackupLogFilter(logging.Filter): '''忽略带db backup的日志''' def filter(self, record):#固定写法 return "db backup" in record.getMessage()#如果日志里有db backup,那就过滤,没有就显示日志 #1.生成logger对象 logger = logging.getLogger("gao")#创建日志对象 logger.setLevel(logging.INFO) #设置全局等级 #2.生成hanlder console = logging.StreamHandler()#日志以屏幕形式输出 console.setLevel(logging.WARNING)#设置屏幕等级 #text = logging.FileHandler("gao.log")#日志以文件格式输出 text.setLevel(logging.WARNING)#设置文件等级 #2.1把handle对象绑定到logger logger.addHandler(console) logger.addHandler(text) #3.生成formatter对象 console_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s') file_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s') console.setFormatter(console_formatter) text.setFormatter(file_formatter) logger.warning("test1") logger.info("test2") logging.warning("####")#如果xxxx里有db backup,那就过滤,没有就显示日志
1.5 RotatingFileHandler
当文件到达一定大小后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出。当chat.log 达到指定的大小之后,RotatingFileHandler自动把文件改名为 chat.log.1。不过,如果chat.log1 重命名为 chat.log2, 最后重新创建 chat.log 继续输出日志情况。它的函数是:
RotatingFileHandler (filename [, mode[, maxBytes [, backupCount]]])
maxBytes用于制定日志文件的最大文件大小。如果maxbytes 为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
backCount 用于指定保留的备份文件的个数。比如:如果指定为2,但上面描述的重命名过程发生时,原有的 chat.log.2 并不会被更名,而是被删除。
import logging from logging import handlers #1.生成logger对象 logger = logging.getLogger("gao")#创建日志对象 logger.setLevel(logging.INFO) #设置全局等级 #2.生成hanlder console = logging.StreamHandler()#日志以屏幕形式输出 console.setLevel(logging.WARNING)#设置屏幕等级 text = handlers.RotatingFileHandler("gao.log",maxBytes=3,backupCount=6)#字节,log次数 text.setLevel(logging.WARNING)#设置文件等级 #2.1把handle对象绑定到logger logger.addHandler(console) logger.addHandler(text) #3.生成formatter对象 console_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s') file_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s') console.setFormatter(console_formatter) text.setFormatter(file_formatter) logger.warning("test1") logger.info("test2")
1.6 TimeRotatingFileHandler
通过时间间隔一定时间就自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的函数是:
RotatingFileHandler (filename[, when [, interval [, backupCount]]
其中filename 参数和backupCount 参数和 RotatingFileHandler 具有相同的意义。
interval 是时间间隔
when 参数是一个字符串。表示时间间隔的单位,不区分大小写,它有以下取值:
S 秒
M 分
H 小时
D 天
W 每星期(interval = 0 时代表星期一)
midnight 每天凌晨
import logging from logging import handlers #1.生成logger对象 logger = logging.getLogger("gao")#创建日志对象 logger.setLevel(logging.INFO) #设置全局等级 #2.生成hanlder console = logging.StreamHandler()#日志以屏幕形式输出 console.setLevel(logging.WARNING)#设置屏幕等级 text = handlers.TimedRotatingFileHandler("gao.log", when="10", interval=5, backupCount=6) text.setLevel(logging.WARNING)#设置文件等级 #2.1把handle对象绑定到logger logger.addHandler(console) logger.addHandler(text) #3.生成formatter对象 console_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s') file_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s') console.setFormatter(console_formatter) text.setFormatter(file_formatter) logger.warning("test1") logger.info("test2")
2.序列化
2.1 json
只转成字符串
import json fruits = {'fruit': 'apple', 'fruit1': 'watermelon'} d = json.dumps(fruits)#将字典转为字符串 print(d, type(d)) a = json.loads(d)#将字符串在转为先前的字符类型 print(a, type(a))
意义:
1.把内存数据通过网络远程共享给其他人
2.可以跨平台,跨语言
存到文件中
import json f = open("test.json", "w") d = json.dump(fruits, f) #将字典改为字符串并传入文件 f = open("test.json", "r")#读取文件内容再将内容转为原先的格式 d = json.load(f) print(d, type(d)) #可以dump多次,不能load多次
2.2 pickle
只转成pickle类型
import pickle fruits = {'fruit': 'apple', 'fruit1': 'watermelon'} d = pickle.dumps(fruits)#将字典转为bytes类型 print(d, type(d)) a = pickle.loads(d)#将字符串在转为先前的字符类型 print(a, type(a))
传入文件中
import pickle f = open("test.pkl", "wb") d = pickle.dump(fruits, f) #将字典改为pickle类型并传入文件 f = open("test.json", "rb")#读取文件内容再将内容转为原先的格式 d = pickle.load(f) print(d, type(d))
json 与 pickle 的优缺点
json:
优点:跨语言,体积小
缺点:只支持 int\str\tuple\list\dict
pickle:
优点:专为python设计,适合python所有的数据类型
缺点:只能在python中使用,储存数据占空间大
2.3 shelve
先在pycharm创一个文件
import shelve f = shelve.open('xin.sev') names = ['1', '2', '3'] info = {'name': 'gao hui', 'age': '21'} f['info_gao'] = info #持久化列表 f['name'] = names
然后在终端里面找到文件
kouhuideMacBook-Air:module kouhui$ python3 Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 05:52:31) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import shelve >>> f = shelve.open(xin.sev) >>> f = shelve.open('xin.sev') >>> f <shelve.DbfilenameShelf object at 0x1053d6208> >>> a = list(f) >>> print(a) ['info_gao', 'name'] >>> list(f.items()) [('info_gao', {'name': 'gao hui', 'age': '21'}), ('name', ['1', '2', '3'])] >>> f.get('info_gao') {'name': 'gao hui', 'age': '21'} >>> f.get('name') ['1', '2', '3']
3.random
randint 可取到边界值
>>> import random >>> random.randint(0,3) 3 >>> >>> random.randint(0,3) 2 >>> random.randint(0,3) 2 >>> random.randint(0,3) 3 >>> random.randint(0,3) 0
randrange 取不到最大的边界值
>>> random.randrange(0,3) 2 >>> random.randrange(0,3) 1 >>> random.randrange(0,3) 2 >>> random.randrange(0,3) 1 >>> random.randrange(0,3) 0 >>>
random.sample 在范围内取个数
>>> random.sample('wdasdqdq231',3) ['3', '2', 'a'] >>> random.sample('wdasdqdq231',3) ['w', 'q', '1'] >>> random.sample('wdasdqdq231',3) ['w', 'd', 's'] >>> random.sample('wdasdqdq231',3) ['1', 'd', 'q'] >>> random.sample('wdasdqdq231',3) ['s', '2', 'd'] >>> random.sample('wdasdqdq231',3) ['q', 'w', 'd'] >>> random.sample('wdasdqdq231',3) ['d', 'd', 's'] >>>
4.configparser
放在ini文件中的内容 [leogao] name = leogao password = 123456 expire = 2017-08-06 [yanhong] name = yanhong password = 12345 expire = 2017-09-06
import configparser config=configparser.ConfigParser() config.read('文件名') print(config.sections) 输出为 ['leogao', 'yanhong'] 查看laogao下的所有的key print(config.options('leogao')) 输出为 ['name', 'password', 'expire'] 查看leogao下的name的值 val=config.get('leogao','name')