>

python之常用模块,python的常用模块

- 编辑:www.bifa688.com -

python之常用模块,python的常用模块

 

模块:用一群代码达成了有个别意义的代码集结,模块是不带 .py 扩张的此外二个 Python 文件的文件名。

Python学习——python的常用模块,python学习模块

模块:用一群代码达成了有些意义的代码会集,模块是不带 .py 扩张的别的一个Python 文件的文件名。

一、time & datetime模块

 1 import time
 2 import datetime
 3 
 4 print(time.asctime())      # 返回时间格式:Sun May  7 21:46:15 2017
 5 print(time.time())         # 返回时间戳 ‘1494164954.6677325’
 6 print(time.gmtime())       # 返回本地时间 的struct time对象格式,time.struct_time(tm_year=2017, tm_mon=5, tm_mday=7, tm_hour=22, tm_min=4, tm_sec=53, tm_wday=6, tm_yday=127, tm_isdst=0)
 7 print(time.localtime())    # 返回本地时间 的struct time对象格式,time.struct_time(tm_year=2017, tm_mon=5, tm_mday=7, tm_hour=22, tm_min=4, tm_sec=53, tm_wday=6, tm_yday=127, tm_isdst=0)
 8 print(time.gmtime(time.time()-800000))   # 返回utc时间的struc时间对象格式
 9 print(time.asctime(time.localtime()))    # 返回时间格式Sun May  7 22:15:09 2017
10 print(time.ctime())                      # 返回时间格式Sun May  7 22:15:09 2017
11 print(time.strftime('%Y-%m-%d'))         #默认当前时间 2017-05-07
12 print(time.strftime('%Y-%m-%d',time.localtime())) #默认当前时间 2017-05-07
13 
14 string_struct = time.strptime("2016/05/22","%Y/%m/%d") # 将日期字符串 转成 struct时间对象格式
15 print(string_struct)                     # 返回struct time对象格式 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=143, tm_isdst=-1)
16 
17 # 将日期字符串转成时间戳
18 struct_stamp = time.mktime(string_struct) # 将struct time时间对象转成时间戳
19 print(struct_stamp)                         # 返回时间戳 ‘1463846400.0’
20 
21 # 将时间戳转为字符串格式
22 print(time.gmtime(time.time()-86640))         # 将utc时间戳转换成struct_time格式
23 print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) # 将utc struct_time格式转成指定的字符串格式
24 
25 
26 # 时间加减
27 print(datetime.datetime.now())           # 返回当前时间 2017-05-07 22:36:45.179732
28 print(datetime.date.fromtimestamp(time.time()))  # 时间戳直接转换成日期格式 2017-05-07
29 print(datetime.datetime.now()   datetime.timedelta(3))    # 返回时间在当前日期上  3 天
30 print(datetime.datetime.now()   datetime.timedelta(-3))    # 返回时间在当前日期上 -3 天
31 print(datetime.datetime.now()   datetime.timedelta(hours= 3)) # 返回时间在当前时间上  3 小时
32 print(datetime.datetime.now()   datetime.timedelta(minutes= 30)) # 返回时间在当前时间上  30 分钟
33 
34 c_time  = datetime.datetime.now()
35 print(c_time)                          # 当前时间为 2017-05-07 22:52:44.016732
36 print(c_time.replace(minute=3,hour=2)) # 时间替换 替换时间为‘2017-05-07 02:03:18.181732’
37 
38 print(datetime.timedelta)      # 表示时间间隔,即两个时间点之间的长度
39 print (datetime.datetime.now() - datetime.timedelta(days=5))  # 返回时间在当前时间上 -5 天
40 
41 # python 日历模块
42 import calendar
43 
44 print(calendar.calendar(theyear= 2017))     # 返回2017年整年日历
45 print(calendar.month(2017,5))               # 返回某年某月的日历,返回类型为字符串类型
46 
47 calendar.setfirstweekday(calendar.WEDNESDAY) # 设置日历的第一天(第一天以星期三开始)
48 cal = calendar.month(2017, 4)
49 print (cal)
50 
51 print(calendar.monthrange(2017,5))        # 返回某个月的第一天和这个月的所有天数
52 print(calendar.monthcalendar(2017,5))     # 返回某个月以每一周为元素的序列
53 
54 cal = calendar.HTMLCalendar(calendar.MONDAY)
55 print(cal.formatmonth(2017, 5))           # 在html中打印某年某月的日历
56 
57 print(calendar.isleap(2017))             # 判断是否为闰年
58 print(calendar.leapdays(2000,2017))       # 判断两个年份间闰年的个数

 

二、random模块

 1 import random
 2 
 3 # 随机数
 4 print(random.random())              # 返回一个随机小数'0.4800545746046827'
 5 print(random.randint(1,5))          # 返回(1-5)随机整型数据
 6 print(random.randrange(1,10))       # 返回(1-10)随机数据
 7 
 8 # 生成随机验证码
 9 code = ''
10 for i in range(4):
11     current = random.randrange(0,4)
12     if current != i:
13         temp = chr(random.randint(65,90))
14     else:
15         temp = random.randint(0,9)
16     code  = str(temp)
17 
18 print(code)

三、OS模块

 1 import os
 2 
 3 print(os.getcwd())        # 获得当前工作目录
 4 print(os.chdir("dirname")) # 改变当前脚本的工作路径,相当于shell下的cd
 5 print(os.curdir)            # 返回当前目录‘.'
 6 print(os.pardir)            # 获取当前目录的父目录字符串名‘..'
 7 print(os.makedirs('dirname1/dirname2'))     # 可生成多层递归目录
 8 print(os.removedirs('dirname1/dirname2'))      # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
 9 print(os.mkdir('test4'))         # 生成单级目录;相当于shell中mkdir dirname
10 print(os.rmdir('test4'))        # 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
11 print(os.listdir('/pythonStudy/s12/test'))   # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
12 print(os.remove('log.log'))            # 删除一个指定的文件
13 print(os.rename("oldname","newname"))    # 重命名文件/目录)
14 print(os.stat('/pythonStudy/s12/test'))     # 获取文件/目录信息
15 print(os.pathsep)            # 输出用于分割文件路径的字符串';'
16 print(os.name)               # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
17 print(os.system(command='bash'))   # 运行shell命令,直接显示
18 print(os.environ)                  # 获得系统的环境变量
19 print(os.path.abspath('/pythonStudy/s12/test'))   # 返回path规范化的绝对路径
20 print(os.path.split('/pythonStudy/s12/test'))     # 将path分割成目录和文件名二元组返回
21 print(os.path.dirname('/pythonStudy/s12/test'))    # 返回path的目录。其实就是os.path.split(path)的第一个元素
22 print(os.path.basename('/pythonStudy/s12/test'))   # 返回path最后的文件名。如果path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
23 print(os.path.exists('test'))                 # 判断path是否存在
24 print(os.path.isabs('/pythonStudy/s12/test'))    # 如果path是绝对路径,返回True
25 print(os.path.isfile('test'))                   # 如果path是一个存在的文件,返回True。否则返回False
26 print(os.path.isdir('/pythonStudy/s12/test'))    # 如果path是一个存在的目录,则返回True。否则返回False
27 print(os.path.getatime('/pythonStudy/s12/test'))   # 返回path所指向的文件或者目录的最后存取时间
28 print(os.path.getmtime('/pythonStudy/s12/test'))   # 返回path所指向的文件或者目录的最后修改时间

四、sys模块

1 import sys
2 
3 print(sys.argv)          # 命令行参数List,第一个元素是程序本身路径
4 print(sys.exit(n))     # 退出程序,正常退出时exit(0)
5 print(sys.version)       # 获取python的版本信息
6 print(sys.path)          # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
7 print(sys.platform)      # 返回操作平台的名称

五、shutil模块

 1 import shutil
 2 shutil.copyfileobj(fsrc, fdst, length=16*1024)      # 将文件内容拷贝到另一个文件中,可以是部分内容
 3 shutil.copyfile(src, dst)                           # 拷贝文件
 4 shutil.copymode(src, dst)                           # 仅拷贝权限。内容、组、用户均不变
 5 shutil.copystat(src, dst)                           # 拷贝状态的信息,包括:mode bits, atime, mtime, flags
 6 shutil.copy(src, dst)                               # 拷贝文件和权限
 7 shutil.copy2(src, dst)                              # 拷贝文件和状态信息
 8 shutil.move(src, dst)                               # 递归的去移动文件
 9 
10 # base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径
11 # format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
12 # root_dir: 要压缩的文件夹路径(默认当前目录)
13 # owner: 用户,默认当前用户
14 # group: 组,默认当前组
15 # logger: 用于记录日志,通常是logging.Logger对象
16 shutil.make_archive(base_name, format,root_dir,owner,group,logger)   # 创建压缩包并返回文件路径,例如:zip、tar
17 
18 shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的:
19 
20 # zipfile 压缩解压
21 
22 import zipfile
23 # 压缩
24 z = zipfile.ZipFile('laxi.zip', 'w')
25 z.write('a.log')
26 z.write('data.data')
27 z.close()
28 
29 # 解压
30 z = zipfile.ZipFile('laxi.zip', 'r')
31 z.extractall()
32 z.close()
33 
34 # tarfile 压缩解压
35 
36 import tarfile
37 
38 # 压缩
39 tar = tarfile.open('your.tar','w')
40 tar.add('/Users/wupeiqi/PycharmProjects/bbs2.zip', arcname='bbs2.zip')
41 tar.add('/Users/wupeiqi/PycharmProjects/cmdb.zip', arcname='cmdb.zip')
42 tar.close()
43 
44 # 解压
45 tar = tarfile.open('your.tar','r')
46 tar.extractall()  # 可设置解压地址
47 tar.close()

六、XML管理模块

 

  1 # xml的格式如下,就是通过<>节点来区别数据结构的:
  2 xmltest.xml
  3 
  4 <?xml version="1.0"?>
  5 
  6 <data>
  7 
  8     <country name="Liechtenstein">
  9 
 10         <rank updated="yes">2</rank>
 11 
 12         <year>2008</year>
 13 
 14         <gdppc>141100</gdppc>
 15 
 16         <neighbor name="Austria" direction="E"/>
 17 
 18         <neighbor name="Switzerland" direction="W"/>
 19 
 20     </country>
 21 
 22     <country name="Singapore">
 23 
 24         <rank updated="yes">5</rank>
 25 
 26         <year>2011</year>
 27 
 28         <gdppc>59900</gdppc>
 29 
 30         <neighbor name="Malaysia" direction="N"/>
 31 
 32     </country>
 33 
 34     <country name="Panama">
 35 
 36         <rank updated="yes">69</rank>
 37 
 38         <year>2011</year>
 39 
 40         <gdppc>13600</gdppc>
 41 
 42         <neighbor name="Costa Rica" direction="W"/>
 43 
 44         <neighbor name="Colombia" direction="E"/>
 45 
 46     </country>
 47 
 48 </data> 
 49 
 50 
 51 #  xml协议在各个语言里的都 是支持的,在python中可以用以下模块操作xml  
 52 
 53 import xml.etree.ElementTree as ET
 54 
 55 tree = ET.parse("xmltest.xml")
 56 root = tree.getroot()
 57 print(root.tag)
 58 
 59 #遍历xml文档
 60 for child in root:
 61     print(child.tag, child.attrib)
 62     for i in child:
 63         print(i.tag,i.text)
 64 
 65 #只遍历year 节点
 66 for node in root.iter('year'):
 67     print(node.tag,node.text)
 68 
 69 
 70 # 修改和删除xml文档内容
 71 
 72 import xml.etree.ElementTree as ET
 73 
 74 tree = ET.parse("xmltest.xml")
 75 root = tree.getroot()
 76 
 77 #修改
 78 
 79 for node in root.iter('year'):
 80     new_year = int(node.text)   1
 81     node.text = str(new_year)
 82     node.set("updated","yes")
 83 tree.write("xmltest.xml")
 84 
 85 #删除node
 86 
 87 for country in root.findall('country'):
 88    rank = int(country.find('rank').text)
 89    if rank > 50:
 90        root.remove(country)
 91 tree.write('output.xml')
 92 
 93 
 94 # 自己创建xml文档
 95 import xml.etree.ElementTree as ET
 96 
 97 new_xml = ET.Element("namelist")
 98 name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"})
 99 age = ET.SubElement(name, "age", attrib={"checked": "no"})
100 age = ET.SubElement(name, "age")
101 age.text = '33'
102 name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
103 age = ET.SubElement(name2, "age")
104 age.text = '19'
105 et = ET.ElementTree(new_xml)  # 生成文档对象
106 et.write("test.xml", encoding="utf-8", xml_declaration=True)
107 ET.dump(new_xml)  # 打印生成的格式

七、configparser模块

     用于转移和改换常见配置文书档案

 

 1 # 好多软件的常见文档格式如下
 2  [DEFAULT]
 3  compressionlevel = 9
 4  serveraliveinterval = 45
 5  compression = yes
 6  forwardx11 = yes
 7  
 8  [bitbucket.org]
 9  user = hg
10  
11  [topsecret.server.com]
12  host port = 50022
13  forwardx11 = no
14  
15  # python 生成一个这样的文档
16  
17  import configparser
18  
19  config = configparser.ConfigParser()
20  
21  config["DEFAULT"] = {'ServerAliveInterval': '45',
22                       'Compression': 'yes',
23                       'CompressionLevel': '9'}
24  
25  config['bitbucket.org'] = {}
26  config['bitbucket.org']['User'] = 'hg'
27  config['topsecret.server.com'] = {}
28  topsecret = config['topsecret.server.com']
29  topsecret['Host Port'] = '50022'
30  topsecret['ForwardX11'] = 'no'
31  config['DEFAULT']['ForwardX11'] = 'yes'
32  with open('example.ini', 'w') as configfile:
33      config.write(configfile)
34  
35  
36  
37  # 写完了还可以再读出来
38  
39  import configparser
40  config = configparser.ConfigParser()
41  config.sections()
42  file = config.read('example.ini')
43  print(file)      # ['example.ini']
44  
45  title = config.sections()
46  print(title)     # ['bitbucket.org', 'topsecret.server.com']
47  
48  print('bitbucket.org' in config)     # True
49  print('bytebong.com' in config)      # False
50  print(config['bitbucket.org']['User'])   # hg
51  print(config['DEFAULT']['Compression'])   # yes
52  
53  topsecret = config['topsecret.server.com']
54  print(topsecret['ForwardX11'])           # no
55  print(topsecret['Host Port'])         # 50022
56  
57  for key in config['topsecret.server.com']:
58      print(key)
59  '''
60    输出结果:
61              host port
62              forwardx11
63              compressionlevel
64              serveraliveinterval
65              compression
66  '''
67  print(config['topsecret.server.com']['Compression'])   # yes
68 
69 # configparser增删改查语法
70 import configparser
71 
72 config = configparser.ConfigParser()
73 config.read('i.cfg')
74 
75 secs = config.sections()       # 返回配置文件中的主节点
76 print (secs)
77 
78 options = config.options('bitbucket.org')
79 print(options)                 # 返回所有子节点信息
80 
81 item_list = config.items('bitbucket.org')
82 print(item_list)              # 列出所有子节点详细信息
83 
84 val = config.get('topsecret.server.com','host port')
85 print(val)                    # 返回单个子节点信息
86 
87 val2 = config.getint('topsecret.server.com','host port')
88 print(val2)
89 
90 # 删除'bitbucket.org'
91 sec = config.remove_section('bitbucket.org')
92 config.write(open('i.cfg','w'))
93 
94 
95 sec2 = config.add_section('huhuan2')      # 添加主节点
96 config.set('huhuan2','k','1111')          # 添加子节点
97 config.set('huhuan','kk','2222')
98 config.remove_option('huhuan','kk')       # 删除子节点
99 config.write(open('i.cfg','w'))

 

八、hashlib模块

  用于加密相关的操作

 1 import hashlib
 2 
 3 # ****** md5 ******
 4 m =hashlib.md5()
 5 m.update(b'hello')
 6 print(m.hexdigest())     # 16进制格式
 7 print(m.digest())        # 2进制格式
 8 
 9 # ****** shal ******
10 hash = hashlib.sha1()
11 hash.update(b'hello')
12 print(hash.hexdigest())
13 
14 # ****** sha224 ******
15 hash = hashlib.sha224()
16 hash.update(b'hello')
17 print(hash.hexdigest())
18 
19 # ****** sha256 ******
20 hash = hashlib.sha256()
21 hash.update(b'hello')
22 print(hash.hexdigest())
23 
24 # ****** sha384 ******
25 hash = hashlib.sha384()
26 hash.update(b'hello')
27 print(hash.hexdigest())
28 
29 # ****** sha512 ******
30 hash = hashlib.sha512()
31 hash.update(b'hello')
32 print(hash.hexdigest())
33 
34 运行结果:
35 5d41402abc4b2a76b9719d911017c592
36 b'][email protected]*xbcK*vxb9qx9dx91x10x17xc5x92'
37 aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
38 ea09ae9cc6768c50fcee903ed054556e5bfc8347907f12598aa24193
39 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
40 59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553bcdb9c666fa90125a3c79f90397bdf5f6a13de828684f
41 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043

九、logging 模块

  python的logging模块提供了标准的日志接口,你可以由此它存款和储蓄各类格式的日记,logging的日志能够分成 debug()info()warning()error() and critical() 5个级别。

 1 import logging
 2 
 3 # %(message)s 日志信息
 4 # %(levelno)s 日志级别
 5 # datefmt  设置时间格式
 6 # filename  设置日志保存的路径
 7 # level=loggin.INFO意思是,把日志纪录级别设置为INFO,也就是说,只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里,
 8 # 在这个例子, 第一条日志是不会被纪录的,如果希望纪录debug的日志,那把日志级别改成DEBUG就行了。
 9 logging.basicConfig(format='%(asctime)s %(message)s %(levelno)s', datefmt='%m/%d/%Y %I:%M:%S %p',filename='example.log',level=logging.INFO)
10 logging.debug('This message should go to the log file')
11 logging.info('So should this')

日志格式

%(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 # 对于等级:
 2 
 3 CRITICAL = 50
 4 
 5 ERROR = 40
 6 
 7 WARNING = 30
 8 
 9 INFO = 20
10 
11 DEBUG = 10
12 
13 NOTSET = 0

Python 使用logging模块记录日志涉及八个至关心器重要类:

logger提供了应用程序能够平素动用的接口;

handler将(logger创制的)日志记录发送到合适的指标输出;

filter提供了细度设备来调整输出哪条日志记录;

formatter决定日志记录的末段输出格式。

logger :

每种程序在出口新闻以前都要拿走一个Logger。Logger常常对应了程序的模块名,比方聊天工具的图形分界面模块能够这么获得它的Logger: LOG=logging.getLogger(”chat.gui”)

而基本模块能够如此: LOG=logging.getLogger(”chat.kernel”)

Logger.setLevel(lel):钦赐最低的日志品级,低于lel的等级将被忽略。debug是最低的放置等级,critical为最高

Logger.addFilter(filt)、Logger.removeFilter(filt):增添或删除钦赐的filter

Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):扩展或删除钦赐的handler

Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():能够安装的日志等级

handler

handler

对象承担发送有关的音信到钦点目的地。Python的日志系统有各类Handler能够动用。有个别Handler能够把新闻输出到调节台,有个别Logger能够把音讯输出到文件,还某些Handler能够把新闻发送到互联网上。假如感觉不够用,还足以编写自个儿的Handler。能够透过

addHandler()方法增添四个多handler

Handler.setLevel(lel):钦定被拍卖的新闻等第,低于lel品级的音讯将被忽略

Handler.setFormatter():给那一个handler选择2个格式

Handler.addFilter(filt)、Handler.removeFilter(filt):新添或删除多个filter对象

各样Logger能够附加两个Handler。接下来大家就来介绍部分常用的Handler:
1)    logging.StreamHandler
行使那一个Handler能够向类似与sys.stdout也许sys.stderr的其他公文对象(file object)输出消息。它的构造函数是:
StreamHandler([strm])
中间strm参数是一个文件对象。默许是sys.stderr

2)   logging.FileHandler
和StreamHandler类似,用于向二个文件输出日志消息。但是FileHandler会帮你张开那么些文件。它的构造函数是:
FileHandler(filename[,mode])
filename是文本名,必须钦定三个文本名。
mode是文本的展开药情势。参见Python内置函数open()的用法。私下认可是’a',即增添到文件末尾。

3)   logging.handlers.RotatingFileHandler
那一个Handler类似于地点的FileHandler,不过它能够管理文件大小。当文件达到一定大小之后,它会自行将目今天记文件改名,然后创立多少个新的同名日志文件接二连三输出。例如日志文件是chat.log。当chat.log达到钦命的分寸之后,RotatingFileHandler自动把 文件改名称叫chat.log.1。可是,假若chat.log.1已经存在,会先把chat.log.1重命名叫chat.log.二。。。最终再次创造chat.log,继续输出日志音信。它的构造函数是:
RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
里头filename和mode八个参数和FileHandler同样。
maxBytes用于钦赐日志文件的最大文件大小。倘诺maxBytes为0,意味着日志文件能够极其大,那时上边描述的重命名进程就不会生出。
backupCount用于钦定保留的备份文件的个数。比方,假诺钦赐为2,当上边描述的重命名进程发生时,原有的chat.log.2并不会被更名,而是被删除。

4)   logging.handlers.TimedRotatingFileHandler
其壹Handler和RotatingFileHandler类似,可是,它从不经过决断文件大小来支配几时再度创建日志文件,而是间隔一定时期就 自动成立新的日志文件。重命名的历程与RotatingFileHandler类似,可是新的文书不是增大数字,而是当前光阴。它的构造函数是:
TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
中间filename参数和backupCount参数和RotatingFileHandler具备同等的含义。
interval是时间距离。
when参数是三个字符串。表示时间间隔的单位,不区分轻重缓急写。它有以下取值:
S 秒
M 分
H 小时
D 天
W 每星期(interval==0时期表星期壹)
midnight 每日凌晨

 1 import logging
 2 
 3 logger = logging.getLogger('TEST_LOG')    # 获得一个Logger
 4 logger.setLevel(logging.DEBUG)            # 设置日志级别
 5 
 6 ch = logging.StreamHandler()            # logging.StreamHandler这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。
 7 ch.setLevel(logging.DEBUG)
 8 
 9 fh = logging.FileHandler("access.log")  # 用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件
10 fh.setLevel(logging.WARNING)
11 
12 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  # 设置日志记录的最终输出格式
13 
14 ch.setFormatter(formatter)
15 fh.setFormatter(formatter)
16 
17 # 添加ch,fh到logger
18 logger.addHandler(ch)
19 logger.addHandler(fh)
20 
21 
22 logger.debug('debug message')
23 logger.info('info message')
24 logger.warn('warn message')
25 logger.error('error message')
26 logger.critical('critical message')

文件自动截断实例:

 1 import logging
 2 from logging import handlers
 3 
 4 logger = logging.getLogger(__name__)
 5 log_file = "timelog.log"
 6 fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3)
 7 #fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3)
 8 
 9 formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s')
10 fh.setFormatter(formatter)
11 
12 logger.addHandler(fh)
13 
14 logger.warning("test1")
15 logger.warning("test12")
16 logger.warning("test13")
17 logger.warning("test14")

十、subprocess模块(待定)

十一、json & pickle 模块

用来系列化的三个模块

  • json,用于字符串 和 python数据类型间实行调换
  • pickle,用于python特有的类型 和 python的数据类型间实行调换

Json模块提供了多个效能:dumps、dump、loads、load

pickle模块提供了多个效益:dumps、dump、loads、load

 1 import pickle
 2 
 3 date = {'k1':'123','k2':'hello'}
 4 
 5 str = pickle.dumps(date)    # pickle.dumps 将数据通过特殊的形式转换为只有python认识的字符串
 6 print(str)
 7 
 8 with open('result.pk','w') as fp:  # pickle.dump 将数据通过特殊的形式转换为只有python认识的字符串并写入文件
 9     pickle.dump(date,fp)
10 
11 import json
12 
13 str1 = json.dumps(date)     # json.dumps 将数据通过特殊形式转换为所有程序语言都认识的字符串
14 print(str1)
15 
16 with open('result1.json','w') as fp:  #json.dump 将数据通过特殊的形式转换为只有python认识的字符串并写入文件
17     json.dump(date,fp)

 

模块:用一批代码达成了某些意义的代码集结,模块是不带 .py 扩大的此外三个Python 文件的...

模块,用一群代码完结了有些意义的代码的汇集。 

一、time & datetime模块

恍如于函数式编制程序和面向进程编制程序,函数式编制程序则形成叁个意义,其余代码用来调用就能够,提供了代码的重用性和代码间的耦合。而对此2个复杂的职能来,或者须要三个函数手艺不负众望(函数又可以在分裂的.py文件中),n个 .py 文件组成的代码会集就叫做模块。

 1 import time
 2 import datetime
 3 
 4 print(time.asctime())      # 返回时间格式:Sun May  7 21:46:15 2017
 5 print(time.time())         # 返回时间戳 ‘1494164954.6677325’
 6 print(time.gmtime())       # 返回本地时间 的struct time对象格式,time.struct_time(tm_year=2017, tm_mon=5, tm_mday=7, tm_hour=22, tm_min=4, tm_sec=53, tm_wday=6, tm_yday=127, tm_isdst=0)
 7 print(time.localtime())    # 返回本地时间 的struct time对象格式,time.struct_time(tm_year=2017, tm_mon=5, tm_mday=7, tm_hour=22, tm_min=4, tm_sec=53, tm_wday=6, tm_yday=127, tm_isdst=0)
 8 print(time.gmtime(time.time()-800000))   # 返回utc时间的struc时间对象格式
 9 print(time.asctime(time.localtime()))    # 返回时间格式Sun May  7 22:15:09 2017
10 print(time.ctime())                      # 返回时间格式Sun May  7 22:15:09 2017
11 print(time.strftime('%Y-%m-%d'))         #默认当前时间 2017-05-07
12 print(time.strftime('%Y-%m-%d',time.localtime())) #默认当前时间 2017-05-07
13 
14 string_struct = time.strptime("2016/05/22","%Y/%m/%d") # 将日期字符串 转成 struct时间对象格式
15 print(string_struct)                     # 返回struct time对象格式 time.struct_time(tm_year=2016, tm_mon=5, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=143, tm_isdst=-1)
16 
17 # 将日期字符串转成时间戳
18 struct_stamp = time.mktime(string_struct) # 将struct time时间对象转成时间戳
19 print(struct_stamp)                         # 返回时间戳 ‘1463846400.0’
20 
21 # 将时间戳转为字符串格式
22 print(time.gmtime(time.time()-86640))         # 将utc时间戳转换成struct_time格式
23 print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) # 将utc struct_time格式转成指定的字符串格式
24 
25 
26 # 时间加减
27 print(datetime.datetime.now())           # 返回当前时间 2017-05-07 22:36:45.179732
28 print(datetime.date.fromtimestamp(time.time()))  # 时间戳直接转换成日期格式 2017-05-07
29 print(datetime.datetime.now()   datetime.timedelta(3))    # 返回时间在当前日期上  3 天
30 print(datetime.datetime.now()   datetime.timedelta(-3))    # 返回时间在当前日期上 -3 天
31 print(datetime.datetime.now()   datetime.timedelta(hours= 3)) # 返回时间在当前时间上  3 小时
32 print(datetime.datetime.now()   datetime.timedelta(minutes= 30)) # 返回时间在当前时间上  30 分钟
33 
34 c_time  = datetime.datetime.now()
35 print(c_time)                          # 当前时间为 2017-05-07 22:52:44.016732
36 print(c_time.replace(minute=3,hour=2)) # 时间替换 替换时间为‘2017-05-07 02:03:18.181732’
37 
38 print(datetime.timedelta)      # 表示时间间隔,即两个时间点之间的长度
39 print (datetime.datetime.now() - datetime.timedelta(days=5))  # 返回时间在当前时间上 -5 天
40 
41 # python 日历模块
42 import calendar
43 
44 print(calendar.calendar(theyear= 2017))     # 返回2017年整年日历
45 print(calendar.month(2017,5))               # 返回某年某月的日历,返回类型为字符串类型
46 
47 calendar.setfirstweekday(calendar.WEDNESDAY) # 设置日历的第一天(第一天以星期三开始)
48 cal = calendar.month(2017, 4)
49 print (cal)
50 
51 print(calendar.monthrange(2017,5))        # 返回某个月的第一天和这个月的所有天数
52 print(calendar.monthcalendar(2017,5))     # 返回某个月以每一周为元素的序列
53 
54 cal = calendar.HTMLCalendar(calendar.MONDAY)
55 print(cal.formatmonth(2017, 5))           # 在html中打印某年某月的日历
56 
57 print(calendar.isleap(2017))             # 判断是否为闰年
58 print(calendar.leapdays(2000,2017))       # 判断两个年份间闰年的个数

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

 

模块分为三种:

二、random模块

  • 自定义模块
  • 放置标准模块(又称标准库)
  • 开源模块
 1 import random
 2 
 3 # 随机数
 4 print(random.random())              # 返回一个随机小数'0.4800545746046827'
 5 print(random.randint(1,5))          # 返回(1-5)随机整型数据
 6 print(random.randrange(1,10))       # 返回(1-10)随机数据
 7 
 8 # 生成随机验证码
 9 code = ''
10 for i in range(4):
11     current = random.randrange(0,4)
12     if current != i:
13         temp = chr(random.randint(65,90))
14     else:
15         temp = random.randint(0,9)
16     code  = str(temp)
17 
18 print(code)

自定义模块

三、OS模块

1.概念模块

情境一:

在主目录下建设构造.py文件,依照实际须求能成功相应功效的文件

情景二:

在子目录下创建的.py文件

 1 import os
 2 
 3 print(os.getcwd())        # 获得当前工作目录
 4 print(os.chdir("dirname")) # 改变当前脚本的工作路径,相当于shell下的cd
 5 print(os.curdir)            # 返回当前目录‘.'
 6 print(os.pardir)            # 获取当前目录的父目录字符串名‘..'
 7 print(os.makedirs('dirname1/dirname2'))     # 可生成多层递归目录
 8 print(os.removedirs('dirname1/dirname2'))      # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
 9 print(os.mkdir('test4'))         # 生成单级目录;相当于shell中mkdir dirname
10 print(os.rmdir('test4'))        # 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
11 print(os.listdir('/pythonStudy/s12/test'))   # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
12 print(os.remove('log.log'))            # 删除一个指定的文件
13 print(os.rename("oldname","newname"))    # 重命名文件/目录)
14 print(os.stat('/pythonStudy/s12/test'))     # 获取文件/目录信息
15 print(os.pathsep)            # 输出用于分割文件路径的字符串';'
16 print(os.name)               # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
17 print(os.system(command='bash'))   # 运行shell命令,直接显示
18 print(os.environ)                  # 获得系统的环境变量
19 print(os.path.abspath('/pythonStudy/s12/test'))   # 返回path规范化的绝对路径
20 print(os.path.split('/pythonStudy/s12/test'))     # 将path分割成目录和文件名二元组返回
21 print(os.path.dirname('/pythonStudy/s12/test'))    # 返回path的目录。其实就是os.path.split(path)的第一个元素
22 print(os.path.basename('/pythonStudy/s12/test'))   # 返回path最后的文件名。如果path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
23 print(os.path.exists('test'))                 # 判断path是否存在
24 print(os.path.isabs('/pythonStudy/s12/test'))    # 如果path是绝对路径,返回True
25 print(os.path.isfile('test'))                   # 如果path是一个存在的文件,返回True。否则返回False
26 print(os.path.isdir('/pythonStudy/s12/test'))    # 如果path是一个存在的目录,则返回True。否则返回False
27 print(os.path.getatime('/pythonStudy/s12/test'))   # 返回path所指向的文件或者目录的最后存取时间
28 print(os.path.getmtime('/pythonStudy/s12/test'))   # 返回path所指向的文件或者目录的最后修改时间

2.导入模块

Python之所以采用越来越布满,在必然水平上也凭仗于其为程序猿提供了大气的模块以供役使,如若想要使用模块,则须要导入。导入模块有眨眼之间间两种方式:

1 import module
2 from module.xx.xx import xx
3 from module.xx.xx import xx as rename  
4 from module.xx.xx import *

导入模块其实正是告诉Python解释器去解释这几个py文件

  • 导入三个py文件,解释器解释该py文件
  • 导入3个包,解释器解释该包下的 __init__.py 文件

那正是说难点来了,导入模块时是基于那几个路线作为条件来拓展的啊?即:sys.path

import sys
print sys.path

结果:
['/Users/wupeiqi/PycharmProjects/calculator/p1/pp1', '/usr/local/lib/python2.7/site-packages/setuptools-15.2-py2.7.egg', '/usr/local/lib/python2.7/site-packages/distribute-0.6.28-py2.7.egg', '/usr/local/lib/python2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.10-x86_64.egg', '/usr/local/lib/python2.7/site-packages/xlutils-1.7.1-py2.7.egg', '/usr/local/lib/python2.7/site-packages/xlwt-1.0.0-py2.7.egg', '/usr/local/lib/python2.7/site-packages/xlrd-0.9.3-py2.7.egg', '/usr/local/lib/python2.7/site-packages/tornado-4.1-py2.7-macosx-10.10-x86_64.egg', '/usr/local/lib/python2.7/site-packages/backports.ssl_match_hostname-3.4.0.2-py2.7.egg', '/usr/local/lib/python2.7/site-packages/certifi-2015.4.28-py2.7.egg', '/usr/local/lib/python2.7/site-packages/pyOpenSSL-0.15.1-py2.7.egg', '/usr/local/lib/python2.7/site-packages/six-1.9.0-py2.7.egg', '/usr/local/lib/python2.7/site-packages/cryptography-0.9.1-py2.7-macosx-10.10-x86_64.egg', '/usr/local/lib/python2.7/site-packages/cffi-1.1.1-py2.7-macosx-10.10-x86_64.egg', '/usr/local/lib/python2.7/site-packages/ipaddress-1.0.7-py2.7.egg', '/usr/local/lib/python2.7/site-packages/enum34-1.0.4-py2.7.egg', '/usr/local/lib/python2.7/site-packages/pyasn1-0.1.7-py2.7.egg', '/usr/local/lib/python2.7/site-packages/idna-2.0-py2.7.egg', '/usr/local/lib/python2.7/site-packages/pycparser-2.13-py2.7.egg', '/usr/local/lib/python2.7/site-packages/Django-1.7.8-py2.7.egg', '/usr/local/lib/python2.7/site-packages/paramiko-1.10.1-py2.7.egg', '/usr/local/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-x86_64.egg', '/usr/local/lib/python2.7/site-packages/greenlet-0.4.7-py2.7-macosx-10.10-x86_64.egg', '/Users/wupeiqi/PycharmProjects/calculator', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/site-packages', '/Library/Python/2.7/site-packages']

设若sys.path路径列表未有你想要的门径,能够由此 sys.path.append('路线') 增添。
经过os模块能够收获各样目录,举个例子:

图片 1图片 2

import sys
import os

pre_path = os.path.abspath('../')
sys.path.append(pre_path)

View Code

四、sys模块

开源模块

1、下载安装

图片 3图片 4

yum 
pip
apt-get
...

View Code

图片 5图片 6

下载源码
解压源码
进入目录
编译源码    python setup.py build
安装源码    python setup.py install

View Code

注:在运用源码安装时,供给动用到gcc编写翻译和python开辟条件,所以,要求先实践:

图片 7图片 8

yum install gcc
yum install python-devel
或
apt-get python-dev

View Code

设置成功后,模块会自行安装到 sys.path 中的某部目录中,如:

/usr/lib/python2.7/site-packages/

贰、导入模块

同自定义模块中程导弹入的方法

还有贰个模块 paramiko,paramiko是贰个用以做长途调控的模块,使用该模块能够对长途服务器举行命令或文件操作,值得1说的是,fabric和ansible内部的远程处理正是运用的paramiko来现实。(不是很明白)

1 import sys
2 
3 print(sys.argv)          # 命令行参数List,第一个元素是程序本身路径
4 print(sys.exit(n))     # 退出程序,正常退出时exit(0)
5 print(sys.version)       # 获取python的版本信息
6 print(sys.path)          # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
7 print(sys.platform)      # 返回操作平台的名称

停放模块

一、os

 用于提供系统等级的操作

os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
os.curdir  返回当前目录: ('.')
os.pardir  获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2')    可生成多层递归目录
os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()  删除一个文件
os.rename("oldname","newname")  重命名文件/目录
os.stat('path/filename')  获取文件/目录信息
os.sep    输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
os.linesep    输出当前平台使用的行终止符,win下为"tn",Linux下为"n"
os.pathsep    输出用于分割文件路径的字符串
os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command")  运行shell命令,直接显示
os.environ  获取系统环境变量
os.path.abspath(path)  返回path规范化的绝对路径
os.path.split(path)  将path分割成目录和文件名二元组返回
os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path)  返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path)  如果path是绝对路径,返回True
os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间

合法源码

二、sys

用以提供对解释器相关的操作

sys.argv           命令行参数List,第一个元素是程序本身路径
sys.exit(n)        退出程序,正常退出时exit(0)
sys.version        获取Python解释程序的版本信息
sys.maxint         最大的Int值
sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform       返回操作系统平台名称
sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]

合法源码

三、hashlib 

用于加密相关的操作,代替了md5模块和sha模块,首要提供 SHA一, SHA2二四, SHA25陆, SHA3捌肆, SHA51贰 ,MD5 算法

import hashlib

# ######## md5 ########

hash = hashlib.md5()
hash.update('admin')
print hash.hexdigest()

# ######## sha1 ########

hash = hashlib.sha1()
hash.update('admin')
print hash.hexdigest()

# ######## sha256 ########

hash = hashlib.sha256()
hash.update('admin')
print hash.hexdigest()


# ######## sha384 ########

hash = hashlib.sha384()
hash.update('admin')
print hash.hexdigest()

# ######## sha512 ########

hash = hashlib.sha512()
hash.update('admin')
print hash.hexdigest()

以上加密算法即使依旧极屌,但时候存在缺点,即:通过撞库能够反解。所以,有不可缺少对加密算法中增添自定义key再来做加密。

import hashlib

# ######## md5 ########

hash = hashlib.md5('898oaFs09f')
hash.update('admin')
print hash.hexdigest()

越来越高及的另1种加密方法,python 还有二个 hmac 模块,它里面对我们创立 key 和 内容 再实行拍卖然后再加密.

import hmac
h = hmac.new('wueiqi')
h.update('hellowo')
print h.hexdigest()

四、json 和 pickle 

能够参见上一篇中的内容

五、shutil

高档的 文件、文件夹、压缩包 管理模块

shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另2个文件中,能够部分内容.

图片 9图片 10

def copyfileobj(fsrc, fdst, length=16*1024):
    """copy data from file-like object fsrc to file-like object fdst"""
    while 1:
        buf = fsrc.read(length)
        if not buf:
            break
        fdst.write(buf)

View Code

shutil.copyfile(src, dst)
拷贝文件

图片 11图片 12

def copyfile(src, dst):
    """Copy data from src to dst"""
    if _samefile(src, dst):
        raise Error("`%s` and `%s` are the same file" % (src, dst))

    for fn in [src, dst]:
        try:
            st = os.stat(fn)
        except OSError:
            # File most likely does not exist
            pass
        else:
            # XXX What about other special files? (sockets, devices...)
            if stat.S_ISFIFO(st.st_mode):
                raise SpecialFileError("`%s` is a named pipe" % fn)

    with open(src, 'rb') as fsrc:
        with open(dst, 'wb') as fdst:
            copyfileobj(fsrc, fdst)

View Code

shutil.copymode(src, dst)
仅拷贝权限。内容、组、用户均不改变

图片 13图片 14

def copymode(src, dst):
    """Copy mode bits from src to dst"""
    if hasattr(os, 'chmod'):
        st = os.stat(src)
        mode = stat.S_IMODE(st.st_mode)
        os.chmod(dst, mode)

View Code

shutil.copystat(src, dst)
拷贝状态的消息,包含:mode bits, atime, mtime, flags

图片 15图片 16

def copystat(src, dst):
    """Copy all stat info (mode bits, atime, mtime, flags) from src to dst"""
    st = os.stat(src)
    mode = stat.S_IMODE(st.st_mode)
    if hasattr(os, 'utime'):
        os.utime(dst, (st.st_atime, st.st_mtime))
    if hasattr(os, 'chmod'):
        os.chmod(dst, mode)
    if hasattr(os, 'chflags') and hasattr(st, 'st_flags'):
        try:
            os.chflags(dst, st.st_flags)
        except OSError, why:
            for err in 'EOPNOTSUPP', 'ENOTSUP':
                if hasattr(errno, err) and why.errno == getattr(errno, err):
                    break
            else:
                raise

View Code

shutil.copy(src, dst)
拷贝文件和权力

图片 17图片 18

def copy(src, dst):
    """Copy data and mode bits ("cp src dst").

    The destination may be a directory.

    """
    if os.path.isdir(dst):
        dst = os.path.join(dst, os.path.basename(src))
    copyfile(src, dst)
    copymode(src, dst)

View Code

shutil.copy2(src, dst)
拷贝文件和状态消息

图片 19图片 20

def copy2(src, dst):
    """Copy data and all stat info ("cp -p src dst").

    The destination may be a directory.

    """
    if os.path.isdir(dst):
        dst = os.path.join(dst, os.path.basename(src))
    copyfile(src, dst)
    copystat(src, dst)

View Code

shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的去拷贝文件

例如:copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*')

shutil.rmtree(path[, ignore_errors[, onerror]])
递归的去删除文件

shutil.make_archive(base_name, format,...)

开创压缩包并赶回文件路径,举个例子:zip、tar

  • base_name: 压缩包的文书名,也足以是压缩包的路线。只是文件名时,则保留至当前目录,不然保存至钦点路径,
    如:www                        =>保存至最近路径
    如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/
  • format: 压缩包体系,“zip”, “tar”, “bztar”,“gztar”
  • root_dir: 要缩减的文件夹路线(暗许当前目录)
  • owner: 用户,默许当前用户
  • group: 组,暗许当前组
  • logger: 用于记录日志,平常是logging.Logger对象
  • 图片 21图片 22

    #将 /Users/young/Downloads/test 下的文件打包放置当前程序目录
    
    import shutil
    ret = shutil.make_archive("dddddd", 'gztar', root_dir='/Users/young/Downloads/test')
    
    #将 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目录
    import shutil
    ret = shutil.make_archive("/Users/young/dddddd", 'gztar', root_dir='/Users/young/Downloads/test')

View Code

 

shutil 对压缩包的拍卖是调用 ZipFile 和 TarFile 多个模块来开始展览的,详细:

图片 23图片 24

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()
z.close()

zipfile压缩解压

图片 25图片 26

import tarfile

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

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

tarfile压缩解压

五、shutil模块

六、shelve 

shelve模块是一个简易的k,v将内部存款和储蓄器数据经过文件持久化的模块,能够持久化任何pickle可帮助的python数据格式

图片 27图片 28

import shelve

d = shelve.open('shelve_test') #打开一个文件

class Test(object):
    def __init__(self,n):
        self.n = n


t = Test(123) 
t2 = Test(123334)

name = ["young","Jon","test"]
d["test"] = name #持久化列表
d["t1"] = t      #持久化类
d["t2"] = t2

d.close()

View Code

 1 import shutil
 2 shutil.copyfileobj(fsrc, fdst, length=16*1024)      # 将文件内容拷贝到另一个文件中,可以是部分内容
 3 shutil.copyfile(src, dst)                           # 拷贝文件
 4 shutil.copymode(src, dst)                           # 仅拷贝权限。内容、组、用户均不变
 5 shutil.copystat(src, dst)                           # 拷贝状态的信息,包括:mode bits, atime, mtime, flags
 6 shutil.copy(src, dst)                               # 拷贝文件和权限
 7 shutil.copy2(src, dst)                              # 拷贝文件和状态信息
 8 shutil.move(src, dst)                               # 递归的去移动文件
 9 
10 # base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径
11 # format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
12 # root_dir: 要压缩的文件夹路径(默认当前目录)
13 # owner: 用户,默认当前用户
14 # group: 组,默认当前组
15 # logger: 用于记录日志,通常是logging.Logger对象
16 shutil.make_archive(base_name, format,root_dir,owner,group,logger)   # 创建压缩包并返回文件路径,例如:zip、tar
17 
18 shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的:
19 
20 # zipfile 压缩解压
21 
22 import zipfile
23 # 压缩
24 z = zipfile.ZipFile('laxi.zip', 'w')
25 z.write('a.log')
26 z.write('data.data')
27 z.close()
28 
29 # 解压
30 z = zipfile.ZipFile('laxi.zip', 'r')
31 z.extractall()
32 z.close()
33 
34 # tarfile 压缩解压
35 
36 import tarfile
37 
38 # 压缩
39 tar = tarfile.open('your.tar','w')
40 tar.add('/Users/wupeiqi/PycharmProjects/bbs2.zip', arcname='bbs2.zip')
41 tar.add('/Users/wupeiqi/PycharmProjects/cmdb.zip', arcname='cmdb.zip')
42 tar.close()
43 
44 # 解压
45 tar = tarfile.open('your.tar','r')
46 tar.extractall()  # 可设置解压地址
47 tar.close()

七、xml

xml是促成分化语言或程序之间开始展览数据沟通的磋商,跟json大概,但json使用起来更简便易行,不过,武周,在json还没出生的灰色时代,大家只好选取用xml呀,到现在多数守旧集团如金融行业的繁多系统的接口还要害是xml。

xml的格式如下,就是经过<>节点来分化数据结构的:

图片 29图片 30

<?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>

View Code

xml协议在1一语言里的都 是支撑的,在python中得以用以下模块操作xml

图片 31图片 32

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)

View Code

修改和删除xml文件

图片 33图片 34

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文书档案

图片 35图片 36

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

陆、XML处理模块

八、PyYAML

参照文书档案: 

 

九、ConfigParser

用来对一定的布置举行操作,当前模块的名称在 python 3.x 版本中更换为 configparser。

图片 37图片 38

# 注释1
; 注释2

[section1]
k1 = v1
k2:v2

[section2]
k1 = v1

import ConfigParser

config = ConfigParser.ConfigParser()
config.read('i.cfg')

# ########## 读 ##########
#secs = config.sections()
#print secs
#options = config.options('group2')
#print options

#item_list = config.items('group2')
#print item_list

#val = config.get('group1','key')
#val = config.getint('group1','key')

# ########## 改写 ##########
#sec = config.remove_section('group1')
#config.write(open('i.cfg', "w"))

#sec = config.has_section('wupeiqi')
#sec = config.add_section('wupeiqi')
#config.write(open('i.cfg', "w"))


#config.set('group2','k1',11111)
#config.write(open('i.cfg', "w"))

#config.remove_option('group2','age')
#config.write(open('i.cfg', "w"))

View Code

  1 # xml的格式如下,就是通过<>节点来区别数据结构的:
  2 xmltest.xml
  3 
  4 <?xml version="1.0"?>
  5 
  6 <data>
  7 
  8     <country name="Liechtenstein">
  9 
 10         <rank updated="yes">2</rank>
 11 
 12         <year>2008</year>
 13 
 14         <gdppc>141100</gdppc>
 15 
 16         <neighbor name="Austria" direction="E"/>
 17 
 18         <neighbor name="Switzerland" direction="W"/>
 19 
 20     </country>
 21 
 22     <country name="Singapore">
 23 
 24         <rank updated="yes">5</rank>
 25 
 26         <year>2011</year>
 27 
 28         <gdppc>59900</gdppc>
 29 
 30         <neighbor name="Malaysia" direction="N"/>
 31 
 32     </country>
 33 
 34     <country name="Panama">
 35 
 36         <rank updated="yes">69</rank>
 37 
 38         <year>2011</year>
 39 
 40         <gdppc>13600</gdppc>
 41 
 42         <neighbor name="Costa Rica" direction="W"/>
 43 
 44         <neighbor name="Colombia" direction="E"/>
 45 
 46     </country>
 47 
 48 </data> 
 49 
 50 
 51 #  xml协议在各个语言里的都 是支持的,在python中可以用以下模块操作xml  
 52 
 53 import xml.etree.ElementTree as ET
 54 
 55 tree = ET.parse("xmltest.xml")
 56 root = tree.getroot()
 57 print(root.tag)
 58 
 59 #遍历xml文档
 60 for child in root:
 61     print(child.tag, child.attrib)
 62     for i in child:
 63         print(i.tag,i.text)
 64 
 65 #只遍历year 节点
 66 for node in root.iter('year'):
 67     print(node.tag,node.text)
 68 
 69 
 70 # 修改和删除xml文档内容
 71 
 72 import xml.etree.ElementTree as ET
 73 
 74 tree = ET.parse("xmltest.xml")
 75 root = tree.getroot()
 76 
 77 #修改
 78 
 79 for node in root.iter('year'):
 80     new_year = int(node.text)   1
 81     node.text = str(new_year)
 82     node.set("updated","yes")
 83 tree.write("xmltest.xml")
 84 
 85 #删除node
 86 
 87 for country in root.findall('country'):
 88    rank = int(country.find('rank').text)
 89    if rank > 50:
 90        root.remove(country)
 91 tree.write('output.xml')
 92 
 93 
 94 # 自己创建xml文档
 95 import xml.etree.ElementTree as ET
 96 
 97 new_xml = ET.Element("namelist")
 98 name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"})
 99 age = ET.SubElement(name, "age", attrib={"checked": "no"})
100 age = ET.SubElement(name, "age")
101 age.text = '33'
102 name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
103 age = ET.SubElement(name2, "age")
104 age.text = '19'
105 et = ET.ElementTree(new_xml)  # 生成文档对象
106 et.write("test.xml", encoding="utf-8", xml_declaration=True)
107 ET.dump(new_xml)  # 打印生成的格式

十、logging

用于便捷记录日志且线程安全的模块,logging的日志能够分成 debug()info()warning()error() and critical() 5个级别,上边大家看一下怎么用。

import logging


logging.basicConfig(filename='log.log',
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p',
                    level=10)

logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
logging.log(10,'log')

相应等第:

1 CRITICAL = 50
2 FATAL = CRITICAL
3 ERROR = 40
4 WARNING = 30
5 WARN = WARNING
6 INFO = 20
7 DEBUG = 10

日志格式:

%(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

用户输出的消息

 

 

假诺想同时把log打字与印刷在荧屏和文件日志里,就供给了然一些错综相连的知识 了

Python 使用logging模块记录日志涉及八个重要类,使用官方文书档案中的总结最为稳当:

logger提供了应用程序可以直接行使的接口;

handler将(logger创设的)日志记录发送到合适的目标输出;

filter提供了细度设备来决定输出哪条日志记录;

formatter决定日志记录的末梢输出格式。

logger
各类程序在出口新闻此前都要拿走一个Logger。Logger平时对应了程序的模块名,比方聊天工具的图形分界面模块能够这么获得它的Logger:
LOG=logging.getLogger(”chat.gui”)
而基本模块能够这么:
LOG=logging.getLogger(”chat.kernel”)

Logger.setLevel(lel):钦点最低的日记品级,低于lel的品级将被忽视。debug是低于的放权品级,critical为最高
Logger.addFilter(filt)、Logger.removeFilter(filt):增添或删除钦点的filter
Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):扩充或删除钦定的handler
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():能够安装的日志品级

 

handler

handler对象承担发送有关的音信到钦命目标地。Python的日记系统有八种Handler能够接纳。有些Handler能够把音讯输出到调控台,有个别Logger能够把音讯输出到文件,还有些Handler能够把新闻发送到互联网上。假使以为不够用,还能编写本身的Handler。可以因此addHandler()方法加多多少个多handler
Handler.setLevel(lel):内定被拍卖的信息等第,低于lel级其他消息将被忽略
Handler.setFormatter():给这一个handler采纳贰个格式
Handler.addFilter(filt)、Handler.removeFilter(filt):新扩大或删除3个filter对象

每一种Logger可以叠增添个Handler。接下来大家就来介绍部分常用的Handler:
1) logging.StreamHandler
行使那些Handler能够向类似与sys.stdout也许sys.stderr的别的文件对象(file object)输出新闻。它的构造函数是:
StreamHandler([strm])
个中strm参数是一个文书对象。暗许是sys.stderr

2) logging.FileHandler
和StreamHandler类似,用于向二个文书输出日志音信。可是FileHandler会帮你张开那么些文件。它的构造函数是:
FileHandler(filename[,mode])
filename是文本名,必须钦定三个文件名。
mode是文件的展开药形式。参见Python内置函数open()的用法。暗许是’a',即增加到文件末尾。

3) logging.handlers.RotatingFileHandler
本条Handler类似于地点的FileHandler,然则它能够管理文件大小。当文件达到一定大小之后,它会自行将日前几天记文件改名,然后创建一个新的同名日志文件延续输出。比如日志文件是chat.log。当chat.log达到钦点的分寸之后,RotatingFileHandler自动把 文件改名称叫chat.log.壹。但是,假诺chat.log.一已经存在,会先把chat.log.1重命名叫chat.log.二。。。最终再一次创造chat.log,继续输出日志音信。它的构造函数是:
RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
中间filename和mode七个参数和FileHandler同样。
maxBytes用于钦赐日志文件的最大文件大小。借使maxBytes为0,意味着日志文件能够极其大,那时上边描述的重命名进程就不会时有发生。
backupCount用于内定保留的备份文件的个数。比方,若是内定为二,当上边描述的重命名进程产生时,原有的chat.log.2并不会被更名,而是被删除。

4) logging.handlers.TimedRotatingFileHandler
这几个Handler和RotatingFileHandler类似,不过,它从不经过剖断文件大小来支配哪天再度成立日志文件,而是间隔一定期间就 自动创造新的日记文件。重命名的长河与RotatingFileHandler类似,可是新的文件不是外加数字,而是当前时刻。它的构造函数是:
TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
个中filename参数和backupCount参数和RotatingFileHandler具备同等的意义。
interval是时间距离。
when参数是3个字符串。表示时间间隔的单位,不区分轻重缓急写。它有以下取值:
S 秒
M 分
H 小时
D 天
W 每星期(interval==0时期表星期1)
midnight 每日凌晨

图片 39图片 40

 1 import logging
 2  
 3 #create logger
 4 logger = logging.getLogger('TEST-LOG')
 5 logger.setLevel(logging.DEBUG)
 6  
 7  
 8 # create console handler and set level to debug
 9 ch = logging.StreamHandler()
10 ch.setLevel(logging.DEBUG)
11  
12 # create file handler and set level to warning
13 fh = logging.FileHandler("access.log")
14 fh.setLevel(logging.WARNING)
15 # create formatter
16 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
17  
18 # add formatter to ch and fh
19 ch.setFormatter(formatter)
20 fh.setFormatter(formatter)
21  
22 # add ch and fh to logger
23 logger.addHandler(ch)
24 logger.addHandler(fh)
25  
26 # 'application' code
27 logger.debug('debug message')
28 logger.info('info message')
29 logger.warn('warn message')
30 logger.error('error message')
31 logger.critical('critical message')

View Code

文件自动截断例子:

图片 41图片 42

import logging

from logging import handlers

logger = logging.getLogger(__name__)

log_file = "timelog.log"
#fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3)
fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3)


formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s')

fh.setFormatter(formatter)

logger.addHandler(fh)


logger.warning("test1")
logger.warning("test12")
logger.warning("test13")
logger.warning("test14")

View Code

七、configparser模块

十一、re

常用的正则表明式

 1 '.'     默认匹配除n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
 2 '^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","nabcneee",flags=re.MULTILINE)
 3 '$'     匹配字符结尾,或e.search("foo$","bfoonsdfsf",flags=re.MULTILINE).group()也可以
 4 '*'     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为['abb', 'ab', 'a']
 5 ' '     匹配前一个字符1次或多次,re.findall("ab ","ab cd abb bba") 结果['ab', 'abb']
 6 '?'     匹配前一个字符1次或0次
 7 '{m}'   匹配前一个字符m次
 8 '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
 9 '|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
10 '(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
11  
12  
13 'A'    只从字符开头匹配,re.search("Aabc","alexabc") 是匹配不到的
14 'Z'    匹配字符结尾,同$
15 'd'    匹配数字0-9
16 'D'    匹配非数字
17 'w'    匹配[A-Za-z0-9]
18 'W'    匹配非[A-Za-z0-9]
19 's'     匹配空白字符、t、n、r , re.search("s ","abtc1n3").group() 结果 't'
20  
21 '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{'province': '3714', 'city': '81', 'birthday': '1993'}

最常用的相称语法

re.match 从头开始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回
re.splitall 以匹配到的字符当做列表分隔符
re.sub      匹配字符并替换

仅需轻轻知道的多少个十一分形式

re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)
S(DOTALL): 点任意匹配模式,改变'.'的行为

     用于转移和修改常见配置文书档案

十二、time

时光相关的操作,时间有二种象征方法:

  • 时刻戳               一9陆陆年四月17日现在的秒,即:time.time()
  • 格式化的字符串    201四-1壹-11 1一:11,    即:time.strftime('%Y-%m-%d')
  • 结构化时间          元组包括了:年、日、星期等... time.struct_time    即:time.localtime()

图片 43图片 44

 1 print time.time()
 2 print time.mktime(time.localtime())
 3   
 4 print time.gmtime()    #可加时间戳参数
 5 print time.localtime() #可加时间戳参数
 6 print time.strptime('2014-11-11', '%Y-%m-%d')
 7   
 8 print time.strftime('%Y-%m-%d') #默认当前时间
 9 print time.strftime('%Y-%m-%d',time.localtime()) #默认当前时间
10 print time.asctime()
11 print time.asctime(time.localtime())
12 print time.ctime(time.time())
13   
14 import datetime
15 '''
16 datetime.date:表示日期的类。常用的属性有year, month, day
17 datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
18 datetime.datetime:表示日期时间
19 datetime.timedelta:表示时间间隔,即两个时间点之间的长度
20 timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
21 strftime("%Y-%m-%d")
22 '''
23 import datetime
24 print datetime.datetime.now()
25 print datetime.datetime.now() - datetime.timedelta(days=5)

View Code

 

十三、random

随机数

mport random
print random.random()
print random.randint(1,2)
print random.randrange(1,10)

自便验证码例子:

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

 

 

 1 # 好多软件的常见文档格式如下
 2  [DEFAULT]
 3  compressionlevel = 9
 4  serveraliveinterval = 45
 5  compression = yes
 6  forwardx11 = yes
 7  
 8  [bitbucket.org]
 9  user = hg
10  
11  [topsecret.server.com]
12  host port = 50022
13  forwardx11 = no
14  
15  # python 生成一个这样的文档
16  
17  import configparser
18  
19  config = configparser.ConfigParser()
20  
21  config["DEFAULT"] = {'ServerAliveInterval': '45',
22                       'Compression': 'yes',
23                       'CompressionLevel': '9'}
24  
25  config['bitbucket.org'] = {}
26  config['bitbucket.org']['User'] = 'hg'
27  config['topsecret.server.com'] = {}
28  topsecret = config['topsecret.server.com']
29  topsecret['Host Port'] = '50022'
30  topsecret['ForwardX11'] = 'no'
31  config['DEFAULT']['ForwardX11'] = 'yes'
32  with open('example.ini', 'w') as configfile:
33      config.write(configfile)
34  
35  
36  
37  # 写完了还可以再读出来
38  
39  import configparser
40  config = configparser.ConfigParser()
41  config.sections()
42  file = config.read('example.ini')
43  print(file)      # ['example.ini']
44  
45  title = config.sections()
46  print(title)     # ['bitbucket.org', 'topsecret.server.com']
47  
48  print('bitbucket.org' in config)     # True
49  print('bytebong.com' in config)      # False
50  print(config['bitbucket.org']['User'])   # hg
51  print(config['DEFAULT']['Compression'])   # yes
52  
53  topsecret = config['topsecret.server.com']
54  print(topsecret['ForwardX11'])           # no
55  print(topsecret['Host Port'])         # 50022
56  
57  for key in config['topsecret.server.com']:
58      print(key)
59  '''
60    输出结果:
61              host port
62              forwardx11
63              compressionlevel
64              serveraliveinterval
65              compression
66  '''
67  print(config['topsecret.server.com']['Compression'])   # yes
68 
69 # configparser增删改查语法
70 import configparser
71 
72 config = configparser.ConfigParser()
73 config.read('i.cfg')
74 
75 secs = config.sections()       # 返回配置文件中的主节点
76 print (secs)
77 
78 options = config.options('bitbucket.org')
79 print(options)                 # 返回所有子节点信息
80 
81 item_list = config.items('bitbucket.org')
82 print(item_list)              # 列出所有子节点详细信息
83 
84 val = config.get('topsecret.server.com','host port')
85 print(val)                    # 返回单个子节点信息
86 
87 val2 = config.getint('topsecret.server.com','host port')
88 print(val2)
89 
90 # 删除'bitbucket.org'
91 sec = config.remove_section('bitbucket.org')
92 config.write(open('i.cfg','w'))
93 
94 
95 sec2 = config.add_section('huhuan2')      # 添加主节点
96 config.set('huhuan2','k','1111')          # 添加子节点
97 config.set('huhuan','kk','2222')
98 config.remove_option('huhuan','kk')       # 删除子节点
99 config.write(open('i.cfg','w'))

 

八、hashlib模块

  用于加密相关的操作

 1 import hashlib
 2 
 3 # ****** md5 ******
 4 m =hashlib.md5()
 5 m.update(b'hello')
 6 print(m.hexdigest())     # 16进制格式
 7 print(m.digest())        # 2进制格式
 8 
 9 # ****** shal ******
10 hash = hashlib.sha1()
11 hash.update(b'hello')
12 print(hash.hexdigest())
13 
14 # ****** sha224 ******
15 hash = hashlib.sha224()
16 hash.update(b'hello')
17 print(hash.hexdigest())
18 
19 # ****** sha256 ******
20 hash = hashlib.sha256()
21 hash.update(b'hello')
22 print(hash.hexdigest())
23 
24 # ****** sha384 ******
25 hash = hashlib.sha384()
26 hash.update(b'hello')
27 print(hash.hexdigest())
28 
29 # ****** sha512 ******
30 hash = hashlib.sha512()
31 hash.update(b'hello')
32 print(hash.hexdigest())
33 
34 运行结果:
35 5d41402abc4b2a76b9719d911017c592
36 b']A@*xbcK*vxb9qx9dx91x10x17xc5x92'
37 aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
38 ea09ae9cc6768c50fcee903ed054556e5bfc8347907f12598aa24193
39 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
40 59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553bcdb9c666fa90125a3c79f90397bdf5f6a13de828684f
41 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043

九、logging 模块

  python的logging模块提供了正规化的日志接口,你能够因此它存款和储蓄各样格式的日记,logging的日志能够分成 debug()info()warning()error() and critical() 5个级别。

 1 import logging
 2 
 3 # %(message)s 日志信息
 4 # %(levelno)s 日志级别
 5 # datefmt  设置时间格式
 6 # filename  设置日志保存的路径
 7 # level=loggin.INFO意思是,把日志纪录级别设置为INFO,也就是说,只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里,
 8 # 在这个例子, 第一条日志是不会被纪录的,如果希望纪录debug的日志,那把日志级别改成DEBUG就行了。
 9 logging.basicConfig(format='%(asctime)s %(message)s %(levelno)s', datefmt='%m/%d/%Y %I:%M:%S %p',filename='example.log',level=logging.INFO)
10 logging.debug('This message should go to the log file')
11 logging.info('So should this')

日志格式

%(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 # 对于等级:
 2 
 3 CRITICAL = 50
 4 
 5 ERROR = 40
 6 
 7 WARNING = 30
 8 
 9 INFO = 20
10 
11 DEBUG = 10
12 
13 NOTSET = 0

Python 使用logging模块记录日志涉及多少个关键类:

logger提供了应用程序能够直接使用的接口;

handler将(logger创制的)日志记录发送到合适的目标输出;

filter提供了细度设备来支配输出哪条日志记录;

formatter决定日志记录的尾声输出格式。

logger :

各种程序在输出音讯在此以前都要收获1个Logger。Logger日常对应了程序的模块名,比方聊天工具的图形分界面模块能够那样获得它的Logger: LOG=logging.getLogger(”chat.gui”)

而基本模块能够那样: LOG=logging.getLogger(”chat.kernel”)

Logger.setLevel(lel):内定最低的日志品级,低于lel的品级将被忽略。debug是最低的停放等第,critical为最高

Logger.addFilter(filt)、Logger.removeFilter(filt):增加或删除内定的filter

Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增添或删除钦赐的handler

Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():能够设置的日志等第

handler

handler

对象承担发送有关的新闻到钦赐目标地。Python的日记系统有三种Handler能够利用。有些Handler能够把音信输出到调控台,有个别Logger能够把消息输出到文件,还有些Handler能够把新闻发送到互联网上。假若以为不够用,还足以编写制定本身的Handler。能够透过

addHandler()方法加多八个多handler

Handler.setLevel(lel):钦命被拍卖的消息等第,低于lel级其他音信将被忽略

Handler.setFormatter():给那些handler选用一个格式

Handler.addFilter(filt)、Handler.removeFilter(filt):新增加或删除一个filter对象

各类Logger能够增大多少个Handler。接下来大家就来介绍部分常用的Handler:
1)    logging.StreamHandler
应用这么些Handler能够向类似与sys.stdout也许sys.stderr的别的文件对象(file object)输出新闻。它的构造函数是:
StreamHandler([strm])
里头strm参数是二个文书对象。私下认可是sys.stderr

2)   logging.FileHandler
和StreamHandler类似,用于向一个文本输出日志音讯。可是FileHandler会帮您展开那么些文件。它的构造函数是:
FileHandler(filename[,mode])
filename是文本名,必须内定二个文件名。
mode是文件的张开药格局。参见Python内置函数open()的用法。暗中同意是’a',即增加到文件末尾。

3)   logging.handlers.RotatingFileHandler
本条Handler类似于地方的FileHandler,不过它可以管理文件大小。当文件达到自然大小之后,它会自动将眼明天记文件改名,然后成立三个新的同名日志文件一而再输出。比如日志文件是chat.log。当chat.log达到内定的高低之后,RotatingFileHandler自动把 文件改名称叫chat.log.1。但是,假诺chat.log.壹已经存在,会先把chat.log.一重命名叫chat.log.二。。。最后再一次创造chat.log,继续输出日志新闻。它的构造函数是:
RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
里面filename和mode四个参数和FileHandler同样。
maxBytes用于钦定日志文件的最大文件大小。假如maxBytes为0,意味着日志文件能够极其大,那时上边描述的重命名进程就不会发生。
backupCount用于钦命保留的备份文件的个数。比方,若是钦定为2,当上边描述的重命名进度产生时,原有的chat.log.2并不会被更名,而是被删去。

4)   logging.handlers.TimedRotatingFileHandler
那个Handler和RotatingFileHandler类似,可是,它未有经过推断文件大小来决定哪天再一次创制日志文件,而是间隔一定时期就 自动创立新的日记文件。重命名的进程与RotatingFileHandler类似,但是新的文件不是外加数字,而是当前岁月。它的构造函数是:
TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
其间filename参数和backupCount参数和RotatingFileHandler具备一样的意义。
interval是岁月间隔。
when参数是三个字符串。表示时间距离的单位,不区分轻重缓急写。它有以下取值:
S 秒
M 分
H 小时
D 天
W 每星期(interval==0时代表星期一)
midnight 每一天凌晨

 1 import logging
 2 
 3 logger = logging.getLogger('TEST_LOG')    # 获得一个Logger
 4 logger.setLevel(logging.DEBUG)            # 设置日志级别
 5 
 6 ch = logging.StreamHandler()            # logging.StreamHandler这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。
 7 ch.setLevel(logging.DEBUG)
 8 
 9 fh = logging.FileHandler("access.log")  # 用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件
10 fh.setLevel(logging.WARNING)
11 
12 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  # 设置日志记录的最终输出格式
13 
14 ch.setFormatter(formatter)
15 fh.setFormatter(formatter)
16 
17 # 添加ch,fh到logger
18 logger.addHandler(ch)
19 logger.addHandler(fh)
20 
21 
22 logger.debug('debug message')
23 logger.info('info message')
24 logger.warn('warn message')
25 logger.error('error message')
26 logger.critical('critical message')

文本自动截断实例:

 1 import logging
 2 from logging import handlers
 3 
 4 logger = logging.getLogger(__name__)
 5 log_file = "timelog.log"
 6 fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3)
 7 #fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3)
 8 
 9 formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s')
10 fh.setFormatter(formatter)
11 
12 logger.addHandler(fh)
13 
14 logger.warning("test1")
15 logger.warning("test12")
16 logger.warning("test13")
17 logger.warning("test14")

十、subprocess模块(待定)

十一、json & pickle 模块

用以体系化的多个模块

  • json,用于字符串 和 python数据类型间展开转移
  • pickle,用于python特有的类型 和 python的数据类型间展开转移

Json模块提供了八个效益:dumps、dump、loads、load

pickle模块提供了两个职能:dumps、dump、loads、load

 1 import pickle
 2 
 3 date = {'k1':'123','k2':'hello'}
 4 
 5 str = pickle.dumps(date)    # pickle.dumps 将数据通过特殊的形式转换为只有python认识的字符串
 6 print(str)
 7 
 8 with open('result.pk','w') as fp:  # pickle.dump 将数据通过特殊的形式转换为只有python认识的字符串并写入文件
 9     pickle.dump(date,fp)
10 
11 import json
12 
13 str1 = json.dumps(date)     # json.dumps 将数据通过特殊形式转换为所有程序语言都认识的字符串
14 print(str1)
15 
16 with open('result1.json','w') as fp:  #json.dump 将数据通过特殊的形式转换为只有python认识的字符串并写入文件
17     json.dump(date,fp)

 

本文由必发88手机版发布,转载请注明来源:python之常用模块,python的常用模块