Python 常用模块

本节内容

  1. 模块介绍

  2. os 模块
  3. sys 模块

  4. time & datetime模块

  5. random 模块

  6. json & picle

  7. shutil 模块

  8. shelve 模块

  9. xml 模块

  10. configparser 模块

  11. hashlib 模块

 

 

 

1 模块介绍

模块,用一堆代码实现了某个功能的代码集合。 

类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。

如:os 是系统相关的模块;file是文件操作相关的模块

模块分为三种:

  • 自定义模块
  • 内置标准模块(又称标准库)
  • 开源模块

2 os模块

提供对操作系统进行调用的接口

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os

print(os.getcwd())  #获取当前工作目录,即当前python脚本工作的目录路径
print(os.chdir('dirname')) #改变当前脚本的工作目录,相当于shell下的cd
print(os.curdir)  # 返回当前目录:('.')
print(os.pardir)  # 返回当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2')  # 可生成多层递归目录
os.removedirs('dirname1/dirname2')  # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推(删除多级空目录)
os.mkdir('dirname')  # 生成单级空目录,相当于shell中的mkdir dirname
os.rmdir('dirname')  # 删除单级空目录,如目录不为空则无法删除,报错;相当于shell中的rmdir dirname
print(os.listdir('homework')) # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove('test')  # 删除一个文件,文件不存在报错
os.rename('homework','homework1')  # 重命名文件/目录
os.renames('homework/贺磊','homework/贺磊1')  # 批量重命名
print(os.stat('homework'))  # 获取文件/目录属性信息
print(r'%s'%os.sep)  # 输出操作系统特定的路径分隔符,win下为'\\',linux下为'/'
print(os.linesep)  # 输出当前平台使用的行终止符,win下为'\r\n',linux下为'\n'
print(os.name)  # 输出字符串指示当前使用平台。win=>'nt';linux=>'posix'
os.system('ipconfig')  # 运行shell命令,直接显示
print(os.environ)  # 获取系统的环境变量
print(os.path.isabs('homework'))  # 判断给定路径是否为觉得路径
print(os.path.abspath('homework'))  # 返回绝对路径
print(os.path.split('day/homework'))  # 把绝对路径分为两部分...
print(os.path.dirname('day/homework'))  # 返回path的目录。其实就是os.path.split(path)的第一个元素
print(os.path.basename('day/homework'))  # 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
print(os.path.exists('day/homework'))  # 如果path存在,返回True;如果path不存在,返回False
print(os.path.isfile('homework/目录'))  # 判断给定的path是不是一个目录
print(os.path.isdir('homework'))  # 判断给定的path是不是一个目录
print(os.path.join('homework','Python.py'))  # 拼接地址,可以根据系统自动选择正确的路径分隔符"/"或"\"

# 文件的三个时间
print(os.path.getatime('homework'))
print(os.path.getctime('homework'))
print(os.path.getmtime('homework'))
os模块的基本使用

3 sys模块

import sys
sys.argv  # 命令行参数List,第一个元素是程序本身路径
sys.version  # 返回python解释程序的版本信息
sys.maxsize  # 返回最大的int值
sys.path  # 返回模块的搜索路径,初始化时使用python环境变量的值
sys.platform  # 返回操作系统平台名称,"win32" "linux2"
sys.builtin_module_names  # 返回python中的所有内建模块的名称
sys.modules  # 返回已导入的模块

sys.exit(num)  # 退出程序,正常退出时exit(0)
sys.stdout
sys.stderr
sys.stdin
# 处理标准输出/输入
# 输出重定向
# 错误输出重定向
# 后期补充吧,我也不知道怎么用
sys模块的基本使用

4 time & datetime模块

import time
print(time.altzone/(60*60)) # 返回与utc时间差,以秒计算
print(time.asctime())  # 返回时间格式'Thu Mar  2 21:55:29 2017'
print(time.localtime())  # #返回本地时间 的struct time对象格式
print(time.gmtime())  # 返回utc时间的struc时间对象格式

print(time.asctime(time.localtime()))  # 返回时间格式'Thu Mar  2 21:55:29 2017'
print(time.ctime())  # 返回时间格式'Thu Mar  2 21:55:29 2017'

# 日期字符串  转成 时间戳
string_2_struct = time.strptime("2016/05/22","%Y/%m/%d") #将 日期字符串 转成 struct时间对象格式
print(string_2_struct)
struct_2_stamp = time.mktime(string_2_struct) #将struct时间对象转成时间戳
print(struct_2_stamp)

# 将时间戳转为字符串格式
print(time.gmtime(time.time()-86640)) #将utc时间戳转换成struct_time格式
print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) #将utc struct_time格式转成指定的字符串格式
time模块的基本使用
import time
import datetime

print(datetime.datetime.now())  # 返回现在时刻,格式'2017-03-02 22:04:26.032785'
print(datetime.date.fromtimestamp(time.time()))  # 时间戳直接转成日期格式 '2017-03-02'

print(datetime.datetime.now() )
print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天
print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天
print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时
print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分

c_time  = datetime.datetime.now()
print(c_time.replace(minute=3,hour=2))  # 时间替换
datetime模块的基本使用

更多可以看这里http://www.runoob.com/python/python-date-time.html

5 random模块

随机数

import random
print(random.randint(1,10))
print(random.randrange(1,20,2))
print(random.sample(range(100),5))

生成随机验证码

import random
checkcode = ''
for i in range(4):
    current = random.randrange(0,4)
    if current != i:
        temp = chr(random.randint(65,90))
    else:
        temp = random.randint(0,9)
    checkcode += str(temp)
print(checkcode)
import random
import string

print(string.ascii_uppercase)
print(string.ascii_letters)
print(string.ascii_lowercase)
print(string.digits)
soure = string.ascii_uppercase + string.ascii_letters + string.ascii_lowercase + string.digits
print(''.join(random.sample(soure,4)))

6 json & pickle

之前我萌用过的eval内置方法可以将一个字符串转成python对象,不过eval方法有局限性,eval只能对普通的数据类型(数字,字典,元组,列表,集合[我猜的,仅供参考])进行对象和字符串之间转换,当遇到特殊的类型时eval就不灵了,而且eval的重点是用来执行一个字符串表达式,并返回表达式的值。怎么办呢,还好我们有json和pickle序列化模块。

6.1 什么是序列化

我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化。

6.2 为什么要序列化

1.持久保存当前状态

2.跨平台数据交互

6.3 josn模块

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

json的使用方法如下:

import json
# json的序列化
date = {'name':'40kuai','age':24}
f = open('test.json','w',encoding='utf-8')
f.write(json.dumps(date))
# json.dump(date,f)  # 序列化文件的另一种方式
f.close()

# json的反序列化
f = open('test.json',encoding='utf-8')
date = json.loads(f.read())
# date = json.load(f)  # 反序列化文件的另一种方式
print(date)
f.close()
import json
#dct="{'1':111}"#json 不认单引号
#dct=str({"1":111})#报错,因为生成的数据还是单引号:{'one': 1}

dct='{"1":"111"}'
print(json.loads(dct))

#conclusion:
#        无论数据是怎样创建的,只要满足json格式,就可以json.loads出来,不一定非要dumps的数据才能loads
注意点

6.4 pickel模块

和json差不多(差到哪儿,下面说),直接来看使用,自己去多撸几遍吧。

import pickle
date = {'name':'40块','age':24}
# pickle的序列化
f = open('test.pickle','wb')
f.write(pickle.dumps(date))
# pickle.dump(date,f)  # pickle的另一种方法
f.close()

# pickle的反序列化
f = open('test.pickle','rb')
date = pickle.loads(f.read())
# date = pickle.load(f)  # pickle的另一种方法
print(date) 
f.close()

6.5 Json 和 Pickle的区别(欢迎指导错误)

1.使用场景

  json支持不同语言之间的数据传递,pickle是python中特有的,仅支持python。

2.支持的转换类型

  json可以转换普通的数据类型[数字,元组,列表,字典,集合[我猜的,经供参考]],pickle可以序列化python中的任何数据类型。

3.保存的格式

  json把数据序列化为字符串,pickle把数据序列化为bytes格式。所有在dump和load时json可以指定文件的编码方式,pickle读写文件为bytes方式。

...

7 shutil模块

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

shutil.copyfileobj(fsrc, fdst[, length])

import shutil
# 将文件内容拷贝到另一个文件中(操作的是文件对象)
shutil.copyfileobj(open('old.txt',encoding='utf-8'),open('new.txt','w',encoding='utf-8'))

shutil.copyfile(src, dst)

# 将文件内容拷贝到另一个文件中(操作的是文件)
shutil.copyfile('old.txt','new.txt')

shutil.copymode(src, dst)

# 仅拷贝权限,内容、组、用户均不变
shutil.copymode('old.txt','new.txt')

shutil.copystat(src, dst)

仅拷贝状态信息,包括mode bits,atime,mtime,flags
shutil.copystat('old.txt','new.txt')

shutil.copy(src, dst)

# 拷贝文件和权限
shutil.copy('old.txt','new.txt')

shutil.copy2(src, dst)

# 拷贝文件和状态
shutil.copy2('old.txt','new.txt')

shutil.copytree(src, dst, symlinks=False, ignore=None)

# 递归拷贝文件夹
shutil.copytree('homework','test')  # 目标文件夹不能存在

# 拷贝软连接
shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
'''
通常的拷贝都把软连接拷贝成硬链接,即对待软连接来说,创建新的文件
'''

shutil.ignore_patterns(*patterns)

# 拷贝时排除匹配到的文件和文件名
shutil.copytree('homework','test',ignore=shutil.ignore_patterns('a*'))

shutil.rmtree(path, ignore_errors=False, onerror=None)

# 递归的去删除文件夹
# shutil.rmtree('test')

shutil.move(src, dst)

# 递归的去移动,类似mv命令,其实就是重命名
shutil.move('old.txt','new.txt')

shutil.make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, dry_run=0, owner=None, group=None, logger=None)

创建压缩包并返回文件路径,例如:zip、tar

    • base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径
      如 data_bak                       =>保存至当前路径
      如:/tmp/data_bak =>保存至/tmp/
    • format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
    • root_dir:压缩的根目录。默认为当前目录
    • base_dir:开始压缩的目录。默认为当前目录
    • owner: 用户,默认当前用户
    • group: 组,默认当前组
    • logger: 用于记录日志,通常是logging.Logger对象
# 常用方法如下:
#将 /data 下的文件打包放置当前程序目录
import shutil
ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data')
  
#将 /data下的文件打包放置 /tmp/目录
import shutil
ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data')
import shutil
shutil.make_archive('homework','zip',root_dir='homework/atm/')
shutil.make_archive('homework','zip',base_dir='homework/atm/')
# 顺便看下root_dir和base_dir的区别吧

shutil对压缩的处理调用的是zipfile和tarfile两个模块进行的,详细:

import zipfile

# 压缩
z = zipfile.ZipFile('laxi.zip', 'w')
z.write('a.log')
z.write('data.data')
z.close()

# 解压
z = zipfile.ZipFile('laxi.zip', 'r')
z.extractall(path='.')
z.close()
zipfile压缩解压缩
import tarfile

# 压缩
tar = tarfile.open('your.tar','w')
tar.add('/Users/wupeiqi/PycharmProjects/bbs2.log', arcname='bbs2.log')
tar.add('/Users/wupeiqi/PycharmProjects/cmdb.log', arcname='cmdb.log')
tar.close()

# 解压
tar = tarfile.open('your.tar','r')
tar.extractall()  # 可设置解压地址
tar.close()
tarfile压缩解压缩

8 shelve 模块

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

shelve.open(filename,flag='c',protocol=None,writeback=False)

打开一个保存字典对象方式储存的文件,返回字典对象。参数filename是要保存或打开的文件名称;参数flag与dbm.open()函数里的参数一样;参数protocol是pickle协议的版本;参数writeback是指定是否缓存在内存,如果设置为True则缓存在内存里。

open函数关于打开dbm的方式有三种标志用法:

  C打开文件对其读写,必要时创建该文件

  W打开文件对其读写,如果文件不存在,不会创建它

  N打开文件进行读写,但总是创建一个新的空白文件

Shelf.sync()

如果打开文件时选择参数writeback为True时,调用本函数就会把缓存在内存里的数据写入文件。

# shelve序列化文件并存储
import shelve

s1 = {'name':'40kuai','names':'40块','age':19}
s2 = {'name':'alex','names':'艾利克斯','age':39}
lis = [1,2,3,4,5,6]
f = shelve.open('shelvedate')
f['40kuai'] = s1
f['alex']  = s2
f['lis'] = lis
f.close()

# shelve文件读取
f = shelve.open('shelvedate',flag='w')
lis = f['lis']
print(lis)
f.close()

# 输出 [1, 2, 3, 4, 5, 6]

9 xml模块

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

xml的格式如下,就是通过<>节点来区别数据结构的:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>
xml数据

xml协议在各个语言里的都 是支持的,在python中可以用以下模块操作xml:

import xml.etree.ElementTree as ET
 
tree = ET.parse("xmltest.xml")
root = tree.getroot()
print(root.tag)
 
#遍历xml文档
for child in root:
    print(child.tag, child.attrib)
    for i in child:
        print(i.tag,i.text)
 
#只遍历year 节点
for node in root.iter('year'):
    print(node.tag,node.text)
#---------------------------------------

import xml.etree.ElementTree as ET
 
tree = ET.parse("xmltest.xml")
root = tree.getroot()
 
#修改
for node in root.iter('year'):
    new_year = int(node.text) + 1
    node.text = str(new_year)
    node.set("updated","yes")
 
tree.write("xmltest.xml")
 
 
#删除node
for country in root.findall('country'):
   rank = int(country.find('rank').text)
   if rank > 50:
     root.remove(country)
 
tree.write('output.xml')
View Code

自己创建xml文档:

import xml.etree.ElementTree as ET
 
new_xml = ET.Element("namelist")
name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
age = ET.SubElement(name,"age",attrib={"checked":"no"})
sex = ET.SubElement(name,"sex")
sex.text = '33'
name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
age = ET.SubElement(name2,"age")
age.text = '19'
 
et = ET.ElementTree(new_xml) #生成文档对象
et.write("test.xml", encoding="utf-8",xml_declaration=True)
 
ET.dump(new_xml) #打印生成的格式
View Code

 

10 configparser模块

来看一个好多软件的常见文档格式如下:

 1 [DEFAULT]
 2 ServerAliveInterval = 45
 3 Compression = yes
 4 CompressionLevel = 9
 5 ForwardX11 = yes
 6   
 7 [bitbucket.org]
 8 User = hg
 9   
10 [topsecret.server.com]
11 Port = 50022
12 ForwardX11 = no

如果想用python生成一个这样的文档怎么做呢?

import configparser

config = configparser.ConfigParser()
# 第一种方式
config['default'] = {
    'servername':'40kuaiserver',
    'server_setting':'/etc/server/config',
    'server_port': 8080
}
# 第二种方式
config['bitbucket.org'] = {}
config['bitbucket.org']['User'] = 'hg'
# 第三种方法
config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Host Port'] = 50022
topsecret['ForwardX11'] = 'no' 
config['DEFAULT']['ForwardX11'] = 'yes'

with open('config.ini','w')as config_file:
    config.write(config_file)

 

写完之后要怎么读呢?

先来看看用法吧。

-read(filename) 直接读取ini文件内容
-sections() 得到所有的section,并以列表的形式返回
-options(section) 得到该section的所有option
-items(section) 得到该section的所有键值对
-get(section,option) 得到section中option的值,返回为string类型
-getint(section,option) 得到section中option的值,返回为int类型

import configparser
config = configparser.ConfigParser()
config.read('example.ini')  
print(config.sections())
print(config['bitbucket.org']['user'])

topsecret = config['topsecret.server.com']
print(topsecret['forwardx11'])
print(topsecret['host port'])
for key in config['bitbucket.org']: print(key)  

configparser增删改查语法

import configparser

config = configparser.ConfigParser()

#---------------------------------------------查
print(config.sections())   #[]

config.read('example.ini')

print(config.sections())   #['bitbucket.org', 'topsecret.server.com']

print('bytebong.com' in config)# False

print(config['bitbucket.org']['User']) # hg

print(config['DEFAULT']['Compression']) #yes

print(config['topsecret.server.com']['ForwardX11'])  #no


for key in config['bitbucket.org']:
    print(key)


# user
# serveraliveinterval
# compression
# compressionlevel
# forwardx11


print(config.options('bitbucket.org'))#['user', 'serveraliveinterval', 'compression', 'compressionlevel', 'forwardx11']
print(config.items('bitbucket.org'))  #[('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('forwardx11', 'yes'), ('user', 'hg')]

print(config.get('bitbucket.org','compression'))#yes


#---------------------------------------------删,改,增(config.write(open('i.cfg', "w")))


config.add_section('yuan')

config.remove_section('topsecret.server.com')
config.remove_option('bitbucket.org','user')

config.set('bitbucket.org','k1','11111')

config.write(open('i.cfg', "w"))
增删改查

 

configparser的详细用法:http://blog.csdn.net/gexiaobaohelloworld/article/details/7976944

11 hashlib模块

用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

MD5 算法三个特点:
1.内容相同则hash运算结果相同,内容稍微改变则hash值则变
2.不可逆推
3.相同算法:无论校验多长的数据,得到的哈希值长度固定。

import hashlib
hash = hashlib.md5()
# help(hash.update)
# hash.update(bytes('admin', encoding='utf-8'))
# hash.update('admin'.encode('utf-8'))
# hash.update(bytes('admin',encoding='utf8'))
hash.update(b'admin')
print(hash.hexdigest())
print(hash.digest())
''' 注意:把一段很长的数据update多次,与一次update这段长数据,得到的结果一样 但是update多次为校验大文件提供了可能。 '''

以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

import hashlib
 
# ######## 256 ########
 
hash = hashlib.sha256('898oaFs09f'.encode('utf8'))
hash.update('alvin'.encode('utf8'))
print (hash.hexdigest())#e79e68f070cdedcfe63eaf1a2e92c83b4cfb1b5c6bc452d214c1b7e77cdfd1c7

python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密:

import hmac
# 第一种方式
h = hmac.new(bytes('天王盖地虎', encoding="utf-8"))
h.update('宝塔镇河妖'.encode(encoding='utf-8'))
print(h.hexdigest())

# 第二种方式
h = hmac.new('天王盖地虎'.encode(encoding='utf-8'), '宝塔镇河妖'.encode(encoding='utf-8'))
print(h.hexdigest())

 12.

 suprocess

13. logging模块

拍桌子! logging很重要, 来整理下。 回炉重学

logging的日志可以分为 debug()info()warning()error() and critical() 5个级别

最简单的用法

import logging
logging.debug('debug ....')
logging.info('info ....')
logging.warning('warning ....')
logging.critical("server is down")

# 输出
WARNING:root:warning ....
CRITICAL:root:server is down

# 由此可以得到,默认的日志级别为warning 

在logging中可以设置日志级别以及日志文件路径等。

import logging

# 在设置level时,可以指定日志级别的关键字,也可以指定日志的数字级别,这里的logging.INFO指定的就是数字级别为20,也可以直接输入20
logging.basicConfig(filename='test.log',level=logging.INFO)
logging.debug('debug ....')
logging.info('info ....')
logging.warning('warning ....')
logging.critical("server is down")

logging.basicConfig函数各个参数:

  filename: 指定日志文件名
  filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
  format: 指定输出的格式和内容,format可以输出很多有用信息,如下图所示:

  datefmt: 指定时间格式,同time.strftime()
  level: 设置日志级别,默认为logging.WARNING
  stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

日志格式

%(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进行更多灵活的控制有必要了解一下Logger,Handler,Formatter,Filter的概念

logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical()(分别用以记录不同级别的日志信息)

logging.basicConfig()(用默认日志格式(Formatter)为日志系统建立一个默认的流处理器(StreamHandler),,设置基础配置(如日志级别等)并加到root logger(根Logger)中)这几个logging模块级别的函数

另外还有一个模块级别的函数是logging.getLogger([name])(返回一个logger对象,如果没有指定名字将返回root logger)

下面我们就用getLogger来看看如何输出日志信息吧。

import logging

# 创建两个logger
logger = logging.getLogger()  # 此为默认的logger

logger_test = logging.getLogger('test')
logger_test.setLevel(logging.WARNING)  # 设置自定义的日志级别

# 创建一个handler,用于写入日志文件
file_handler = logging.FileHandler(filename='file_log')
# 创建一个handler,用户输出到控制台
stream_handler = logging.StreamHandler()

# 定义日志输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)

# 定义一个filter
# filter = logging.Filter('mylogger.child1.child2')
# fh.addFilter(filter)

# 给logger添加handler
# logger.addFilter(filter)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)

# logger1.addFilter(filter)
logger_test.addHandler(file_handler)
logger_test.addHandler(stream_handler)


# 记录日志
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_test.debug('logger1 debug message')
logger_test.info('logger1 info message')
logger_test.warning('logger1 warning message')
logger_test.error('logger1 error message')
logger_test.critical('logger1 critical message')
使用getLogger输出日志

logging之日志回滚

import logging
from logging.handlers import RotatingFileHandler

#################################################################################################
#定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M
Rthandler = RotatingFileHandler('myapp.log', maxBytes=10*1024*1024,backupCount=5)
Rthandler.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
Rthandler.setFormatter(formatter)
logging.getLogger('').addHandler(Rthandler)
################################################################################################
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

从上例和本例可以看出,logging有一个日志处理的主对象,其它处理方式都是通过addHandler添加进去的。
logging的几种handle方式如下:

logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件
logging.FileHandler: 日志输出到文件
日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler
logging.handlers.BaseRotatingHandler
logging.handlers.RotatingFileHandler
logging.handlers.TimedRotatingFileHandler
logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets
logging.handlers.DatagramHandler:  远程输出日志到UDP sockets
logging.handlers.SMTPHandler:  远程输出日志到邮件地址
logging.handlers.SysLogHandler: 日志输出到syslog
logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer
logging.handlers.HTTPHandler: 通过"GET"或"POST"远程输出到HTTP服务器

由于StreamHandler和FileHandler是常用的日志处理方式,所以直接包含在logging模块中,而其他方式则包含在logging.handlers模块中,

通过logging.config模块配置日志http://blog.csdn.net/yatere/article/details/6655445

 

14.

 re模块

15.

requests

16.

paramiko

未完待续...

posted @ 2017-02-27 14:12  40块钱抓娃娃  阅读(1154)  评论(0编辑  收藏  举报