模块分为标准库和第三方库,标准库就是python字典的库,比如sys模块、os模块;第三方库就是自己定义的模块(上上篇博客已经讲过)。标准库一遍存储在python安装目录的lib目录下,第三方库存存在lib下的site_package目录下
sys模块和os模块 前面博客已经写过,待后面补充
一、re模块
正则表达式:动态模糊地匹配字符串。下面就介绍几种常用的正则符号
正则表达式的四种套路:re.match() 从字符串开头进行匹配,不需要用‘^’来指定开始位置
re.search() 从全文匹配,可以用‘^’来指定开始位置
re.findall() 将匹配到的所有值以列表的形式的返回
re.split() 将返回的字符串当做列表进行分隔
re.sub() 替换匹配到的字符串
介绍几种常用的正则符号:
#匹配song以及后面的数字 #d代表一个数字,多个数字d+ #D匹配非数字 b=re.match('songd','song12345xiaonan321') print(b.group()) b=re.match('songd+','song12345xiaonan321') print(b.group())
1 #常用的正则表达式符号 2 # . 匹配除换行符以外的任意字符 3 c=re.match('.','song12345xiaonan321') 4 print(c.group()) #匹配了一个任意字符 5 c=re.match('.+','song12345xiaonan321') 6 print(c.group())#匹配了多个任意字符
1 #'[a-zA-Z]'匹配a-z和A-Z之间的任意字符 2 #'n$'判断字符串以n结尾 同 3 a=re.search('x[a-z]+n','song123xiaonan456') 4 print(a.group())
1 #'?'匹配前一个字符1次或0次 2 b=re.search('ong?','songxiaonan') 3 print(b.group())
1 #{n}匹配前面的字符n次 2 a=re.search('[0-9]{4}','song123xiao4422nan5') 3 print(a.group())#输出 4422 4 #{n,}匹配前面的字符至少n次 5 a=re.search('[0-9]{2}','song123xiao4422nan5') 6 print(a.group())#输出 12
1 #{n,m}匹配前面的字符n到m次 2 a=re.search('[0-9]{2,4}','song123xiao4422nan5') 3 print(a.group()) 4 5 #re.findall 可以查询出所有满足条件的结果,注意re.findall无group用法 6 a=re.findall('[0-9]{1,3}','song123xiao4422nan5') 7 print(a)# 输出['123', '442', '2', '5']
#'|' 或,只要满足一个匹配条件就可以 a=re.search('abc|ABC','ABCabc9999') print(a.group()) #ABC b=re.findall('abc|ABC','ABCabc9999') print(b) # ['ABC', 'abc']
1 #'()' 分组匹配 2 a=re.search('(abc){1}','ABCabc9999') 3 print(a.group()) # abc
1 #A 指定字符开头 指定字符结尾 2 a=re.search('As.+n','songxiaonan') 3 print(a.group()) 4 a=re.search('^s.+n','songxiaonan') 5 print(a.group())
1 #D 匹配非数字,包括特殊字符 2 a=re.search('D+','123SJDFS ) EDJIS') 3 print(a.group()) # SJDFS ) EDJIS
1 #w 匹配[a-zA-Z0-9] 2 a=re.search('w+','123SJDFS ) EDJIS') 3 print(a.group()) # 123SJDFS 4 # W 只匹配特殊字符 5 a=re.search('W+','123SJDFS+ ) -EDJIS') 6 print(a.group()) # + ) -
1 #'s' 匹配空白字符 2 a=re.search('s+','123SJDF EDJIS') 3 print(a.group()) 4 print(a)#<_sre.SRE_Match object; span=(7, 13), match=' '>
#分组匹配 a=re.search('(?P<id>[0-9]+)','abdc12345djnjk777788888') print(a.group()) #12345 print(a.groupdict()) # 输出一个字典{'id': '12345'} a=re.search('(?P<id>[0-9]+)(?P<name>[a-zA-Z]+)','abdc12345djnjk777788888') print(a.group()) #12345djnjk print(a.groupdict()) #{'name': 'djnjk', 'id': '12345'} a=a.groupdict()# a变成了一个字典 print(a['name']) #djnjk
1 #re.split 不需要用group 2 a=re.split('[0-9]+','abc123de8f9GF') 3 print(a) # ['abc', 'de', 'f', 'GF']
#re.sub() 替换 不需要用group a=re.sub('[0-9]+','%','SJFISI11111111222SDJFI8888S') print(a)#SJFISI%SDJFI%S
1 #re.I 忽略大小写 2 a=re.search('[a-z]+','abcA',flags=re.I) 3 print(a.group()) #abcA
1 #re.S匹配任意字符,包括换行符 2 a=re.search('.+',' abf',flags=re.S) 3 print(a.group()) # abc 4 a=re.search('.+',' abf') 5 print(a.group()) #abc
二、time和datetime模块
time模块:
import time print(time.process_time())#测量处理器运行时间 print(time.altzone) #与utc(格林威治)时间的时间差,单位为s 格林威在英国, 在格林威治左边的地理位置显示为负数 print(time.altzone/3600) print(time.asctime(time.localtime()))# 将时间转为字符串, 默认为当前时间 t=time.localtime(time.time()+3600*3) #加3个小时 print(t)#返回本地时间 struct time格式 print(t.tm_year) # 打印t里面的年 print(time.gmtime())# 返回但当前utc的时间,必localtime少8小时 print(time.time())#时间戳 从1970年1月1日到现在的时间 单位拟s print(time.time()/(3600*24*365))# 从1970年1月1日到现在的年
time的类型转换:
1 #将字符串转为时间对象 2 t=time.strptime('2018-9-10','%Y-%m-%d') 3 print(t) # time.struct_time(tm_year=2018, tm_mon=9, tm_........ 4 #将时间对象转为时间戳 5 t1=time.mktime(t) 6 print(t1)# 1536508800.0 7 8 9 #时间戳转为字符串 10 t=time.localtime() 11 t1=time.strftime('%y-%m-%d.log',t) 12 print(t1)# 16-11-20.log
datatime模块:
import datetime print(datetime.datetime.now()) #2016-11-20 16:17:52.278179 # datetime进行时间运算 print(datetime.datetime.now()+datetime.timedelta(days=4)) print(datetime.datetime.now()+datetime.timedelta(hours=4)) print(datetime.datetime.now()+datetime.timedelta(minutes=4)) ''' print(datetime.datetime.now()+datetime.timedelta(days=4)) print(datetime.datetime.now()+datetime.timedelta(hours=4)) print(datetime.datetime.now()+datetime.timedelta(minutes=4))'''
datetime替换:
t=datetime.datetime.now() print(t) print(t.replace(hour=12,minute=12)) # 时间替换 '''2016-11-20 16:24:13.123963 2016-11-20 12:12:13.123963'''
三、shelve模块
shelve模块是一个用于持久化存储的模块,它的存储方式采用字典的方式
优点:几乎可以存储任意的python对象
sheleve的使用:
①首先需要创建一个存储对象 shelve.open('filename')
1 import shelve 2 s=shelve.open('file') #创建一个存储对象
②通过字典的形式存储要 要持久化的数据
1 data001='songxiaonan' #data001 data002 data003分别为三种不同的数据类型 将这个单个数据持久化到文件中 2 data002=[1,2,3] 3 data003={ 4 'name':'song', 5 'age':'22' 6 } 7 8 s['data1']=data001 9 s['data2']=data002 10 s['data3']=data003 11 # 执行上面 通过字典k , v 的形式将3个数据存储到了文件 file中。 (同时生成三个文件:file.bak file.dat file.dir 不用理会它们! 不用理会!)
③取已经持久化的数据
1 data2=s['data2'] #取数据 2 data2.append(4) #且可以对数据进行操作 3 print(data2) 4 '''输出:[1, 2, 3, 4]'''
四、random、string模块
1、random模块是用来生成随机数,比如可用于生成随机验证码
print(random.random())#打印随机一个小数 print(random.randint(1,8))#打印指定范围内的整数 包括8 print(random.randrange(1,2))#打印指定范围内的整数 不包括2 print(random.sample('190130',3))# 打印指定字符串中的任意3个
上面,random.randint(n,m) 和random.randrange(n,m) 打印的都是整数, 但是不同点是:random.randint(n,m) 包括m random.randrange(n,m) 不包括m
2、string 模块
这里主要简单介绍string模块中对于ascii部分的用法
1 import string 2 print(string.ascii_letters)#打印ascii码中的所有大小写字母 3 # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 4 print(string.digits)#打印0-9的数字 5 # 0123456789 6 source=string.digits+string.ascii_letters#所有的大小写字母和数字 7 print(random.sample(source,3)) # 所有的大小写字母和数字 8 # ['4', 'L', 'c'] 9 10 print(''.join(random.sample(source,3))) # FNf 11 print(' '.join(random.sample(source,3))) # i G d
五、 logging模块
打印日志模块,默认情况下是将日志直接输出达到屏幕,可以通过logging.basicConfig()方法将日志保存在文件
logging模块的日志分为5个等级:debug、info、warning、error、criticl, 优先级:debug >info > warning > error> critical
1、以下是默认的直接输出到屏幕:
1 import logging 2 logging.warning('i am in a relationship') 3 logging.error('don not give me that!') 4 logging.critical('I almost lost my temper') 5 6 '''输出:ERROR:root:don not give me that! 7 WARNING:root:i am in a relationship 8 CRITICAL:root:I almost lost my temper 9 '''
2、将日志表保存在文件中 logging.basicConfig()
1 logging.basicConfig(filename='song.log',level=logging.DEBUG)# 制定日志文件名 以及日志级别 2 logging.debug('you give me a hard time') 3 logging.info('squeeze fresh orange juice') 4 logging.warning('i am in a relationship') 5 logging.error('don not give me that!') 6 logging.critical('I almost lost my temper') 7 8 #这样就不会再屏幕上输入到屏幕,而是输入到文件 9 #输入大文件后,再次执行该命令,就会追加内容,而不是重写
3、设定文件级别
1 # 设定日志级别的影响:设定了日志级别,输出到文件的日志,只有当前级别的内容和一下级别的内容 2 logging.basicConfig(filename='song001.log',level=logging.WARNING) 3 logging.debug('you give me a hard time--------------------------------') 4 logging.info('squeeze fresh orange juice') 5 logging.warning('i am in a relationship') 6 logging.error('don not give me that!') 7 logging.critical('I almost lost my temper')
4、添加时间
1 #添加时间到日志 2 logging.basicConfig(filename='song002.log', 3 level=logging.INFO, 4 format='%(levelname)s:%(message)s %(asctime)s-%(filename)s', 5 datefmt='%Y-%m-%d %H:%M:%S %p') 6 logging.debug('you give me a hard time--------------------------------') 7 logging.info('squeeze fresh orange juice') 8 logging.warning('i am in a relationship') 9 logging.error('don not give me that!') 10 logging.critical('I almost lost my temper') 11 12 #format参数,是自定输出的日志文件内容: 13 ''' 14 %(levelname)s 日志级别 15 %(message)s 日志内容 16 %(asctime)s 时间 17 %(filename)s 调用日志输出函数的模块文件名 18 %(lineno)s 调用日志输出函数的语句所在的代码行 19 %(funName)s 调用日志输出函数的函数名 20 '''
6、让日志在屏幕输出 ,同时保存到文件
首先要了解logging模块下的四个知识点:
logger:记录器,提供日志接口,供应用代码使用
handler:处理器,将记录器产生的日志发送到指定的目的地
Filter: 过滤器,决定过滤哪些日志
Formatter: 格式化器,指明日志记录输出的具体格式
①创建一个logger实例: logger=logging.getLogger(filename)
1 logger=logging.getLogger('日志记录器')
②加一个处理器 Handler
1 stream=logging.StreamHandler() # StreamHandler 输出到屏幕 2 stream.setLevel(logging.WARNING) #指定输出到屏幕的日志级别 3 4 file=logging.FileHandler('file_log') # StreamHandler 输出到文件 5 file.setLevel(logging.ERROR)
③指定日志输出的格式
1 #设置输出格式 2 s_fmt=logging.Formatter('%(levelname)s: %(message)s') 3 f_fmt=logging.Formatter('%(levelname)s: %(message)s') 4 5 #关联处理器和输出格式 6 stream.setFormatter(s_fmt) 7 file.setFormatter(f_fmt)
④输出日志
1 #在不同目的地输出日志 2 logger.addHandler(stream) 3 logger.addHandler(file) 4 logger.debug('sddsdd') #屏幕和文件中 都没有输出 5 logger.warning('ddddddddd') #屏幕输出了 文件中未输出 6 logger.error('sssssssssssssss') #屏幕和文件中 都输出了
如果文件的日志输出太多,如何切割呢?---------logging模块可以根据时间和文件大小进行日志切割
七、hashlib模块&hmac模块
hashlib模块是专门进行hash算法的库,用于加密,提供不同的加密算法接口:md5、sha1、sha224、sha256、sha384、sha512
1 import hashlib 2 #md5 验证文件移植性 3 #linux中实现有一个md5sum 文件名,命令,可以直接生成一个md5值 4 #MD5值是不可逆的,不可反解 5 #在puthon中对一个字符串进行md5加密,既可以用hashlib模块 6 7 #————————haslib的md5算法 8 m=hashlib.md5() 9 m.update(b'song') 10 print(m.hexdigest()) 11 12 #————————sha1 算法 13 m1=hashlib.s() 14 m1.update(b'song') 15 print(m1.hexdigest()) 16 #还有sha245 sha224 sha385 sha512算法.....常用的是sha256,比MD5要安全 17 #加严算法:将原来的要md5的字符串按照一定的规则拆散,然后再进行md5 18 19 #————————————hmac模块———————————————— 20 import hmac 21 #用于网络消息的加密传输 22 h=hmac.new(b'name',b'age') 23 print(h.hexdigest())# d6b6c13d0719277cdf057a8e6cd778a5
八、configparser
创建和修改配置文件模块,一下是创建一个配置文件的代码:
1 import configparser 2 config=configparser.ConfigParser() 3 config["DEFAULT"] = {'ServerAliveInterval': '45', 4 'Compression': 'yes', 5 'CompressionLevel': '9'} 6 config['bitbucket.org'] = {} 7 config['bitbucket.org']['User'] = 'hg' 8 config['topsecret.server.com'] = { 9 } 10 topsecret = config['topsecret.server.com'] 11 topsecret['Host Port'] = '50022' # mutates the parser 12 topsecret['ForwardX11'] = 'no' 13 14 with open('conf.ini','w') as f: 15 config.write(f)
生成的配置文件:
1 [DEFAULT] 2 serveraliveinterval = 45 3 compressionlevel = 9 4 compression = yes 5 6 [bitbucket.org] 7 user = hg 8 9 [topsecret.server.com] 10 host port = 50022 11 forwardx11 = no
九、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下为
"
"
,Linux下为
"
"
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.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
]
1 #导入controller目录县的account模块 2 mod=__import__('controller.account') 3 print(mod) # <module 'controller' (namespace)> 可以看出导入的模块,为controller,并不是accunt模块 4 5 # 加入fromlist=True参数,就可以导入目录下的某模块 6 7 mod=__import__('controller.account',fromlist=True) 8 print(mod) #<module 'controller.account' from 'C:\Users\songxiaonan.DS\PycharmProjects\day08_learn\反射\controller\account.py'>