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')

 

posted @ 2018-06-10 21:18  辉辉辉辉a  阅读(205)  评论(0编辑  收藏  举报