首页 > 代码库 > python基础之模块二

python基础之模块二

六 logging模块

6.1 函数式简单配置

import logging  #导入模块
logging.debug(debug message)  #调试消息
logging.debug(info message)   #导入消息
logging.debug(warning message)    #警告消息
logging.error(error message)  #错误消息
logging.critical(critical message)    #严重信息

默认情况下python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级为CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息

技术分享
import logging  #导入logging模块

logging.basicConfig(level=logging.DEBUG,
                    format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s,   #
                    datefmt=%a, %d %b %Y %H:%M:%S,    #%a代表周几,%d代表几号,%b代表月份,%Y代表年份,%H%代表小时,%M代表分钟,%S代表秒钟
                    filename=test.log,    #在当前目录新建test.log
                    filemode=w)   #写模式
#time.asctime() 代表‘Thu Apr 27 19:31:07 2017‘
#filename 文件名
logging.debug(debug message)
logging.info(info message)
logging.warning(warning message)
logging.error(error message)
logging.critical(critical message)
# -------输出---------
# Thu, 27 Apr 2017 19:23:58 logging配置.py[line:30] DEBUG debug message
# Thu, 27 Apr 2017 19:23:58 logging配置.py[line:31] INFO info message
# Thu, 27 Apr 2017 19:23:58 logging配置.py[line:32] WARNING warning message
# Thu, 27 Apr 2017 19:23:58 logging配置.py[line:33] ERROR error message
# Thu, 27 Apr 2017 19:23:58 logging配置.py[line:34] CRITICAL critical message
logging模块举例
技术分享
logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:

filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

format参数中可能用到的格式化串:
%(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用户输出的消息
logging模块常用的参数

6.2 logger对象配置

技术分享
import logging

logger = logging.getLogger()    #创建一个logger对象
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler(test.log)

# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()

formatter = logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s)   #实例化formatter 

fh.setFormatter(formatter)
ch.setFormatter(formatter)

logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
logger.addHandler(ch)

logger.debug(logger debug message)
logger.info(logger info message)
logger.warning(logger warning message)
logger.error(logger error message)
logger.critical(logger critical message)
# ----输出信息----
# 2017-04-27 19:52:08,784 - root - WARNING - logger warning message
# 2017-04-27 19:52:08,785 - root - ERROR - logger error message
# 2017-04-27 19:52:08,785 - root - CRITICAL - logger critical message
logging对象配置
技术分享
import logging
def get_logger():
    logger=logging.getLogger()
    fh=logging.FileHandler("logger2")
    sh=logging.StreamHandler()
    logger.setLevel(logging.DEBUG)  #设置输出等级
    fm = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

    logger.addHandler(fh)
    logger.addHandler(sh)

    fh.setFormatter(fm)
    sh.setFormatter(fm)

    return logger
logger=get_logger()

logger.debug(logger debug message)
logger.info(logger info message)
logger.warning(logger warning message)
logger.error(logger error message)
logger.critical(logger critical message)
#文件里不能保存字典,只能是字符串
logger示例1
技术分享
import sys,time
for i in range(100):
    sys.stdout.write(#)
    time.sleep(0.3)
    sys.stdout.flush()
----输出100个-   
####################################
打印进度条

logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供
了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:logger.setLevel(logging.Debug)设置级别

七 序列化模块

之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了,所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值。

技术分享
#---转换类型

d={"name":"yuan"}

s=str(d)

print(type(s))

d2=eval(s)

print(d2[1])

with open("test") as f:

    for i in f :

        if type(eval(i.strip()))==dict:
            print(eval(i.strip())[1])
            
# 计算

print(eval("12*7+5-3"))
该程序会报错---
Traceback (most recent call last):
<class str>
  File "D:/Python/day34/序列化模块.py", line 25, in <module>
    print(d2[1])
KeyError: 1
View Code

什么是序列化?
我们把对象(变量)从内存中变成可存储或传输的过程称为序列化,在python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序化,即unpicking。

json 

如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在WEB页面读取,非常方便。
JSON表示的对象就是标准的JavaScipt语言的一个子集,JSON和python内置的数据类型对应如下:

技术分享
# json.dumps : dict转成str
# json.loads:str转成dict
#网络编程和框架都会用到json
#pickl支持的数据类型更多

import json
dict = {1:2,3:4,"55":"66"}
#test json.dumps
print(type(dict),dict)
json_str=json.dumps(dict)
print("json.dumps(dict) return:")
print(type(json_str),json_str)  #<class ‘str‘> {"1": 2, "3": 4, "55": "66"}

#test json.loads
print("\njson.loads(str) return")
dict_2=json.loads(json_str)
print(type(dict_2),dict_2)  #<class ‘dict‘> {‘1‘: 2, ‘3‘: 4, ‘55‘: ‘66‘}
json中dump和loads的区别
技术分享
import json
i=10
s=hello
t=(1,4,6)
l=[3,5,7]
d={name:"yuan"}

json_str1=json.dumps(i)
json_str2=json.dumps(s)
json_str3=json.dumps(t)
json_str4=json.dumps(l)
json_str5=json.dumps(d)

print(json_str1)   #10
print(json_str2)   #‘"hello"‘   #json格式输出双引号,不能输出单引号
print(json_str3)   #[1, 4, 6]
print(json_str4)   #[3, 5, 7]
print(json_str5)   #{"name": "yuan"}
json举例
技术分享
# import json
#
# d={"name":"egon"}
#
# s = json.dumps(d)    #将字典转为json字符串
# print(type(s))
# print(s)

#----------------------------序列化
import json

dic={name:alvin,age:23,sex:male}
print(type(dic))#<class ‘dict‘>

data=json.dumps(dic)
print("type",type(data))#<class ‘str‘>
print("data",data)


f=open(序列化对象,w)
f.write(data)  #-------------------等价于json.dump(dic,f)
f.close()


#-----------------------------反序列化<br>
import json
f=open(序列化对象)
new_data=json.loads(f.read())#  等价于data=http://www.mamicode.com/json.load(f)

print(type(new_data))
#json.dump(d,f)
json日志

 

python基础之模块二