python-模块

      模块分为标准库和第三方库,标准库就是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('song\d','song12345xiaonan321')
print(b.group())
b=re.match('song\d+','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结尾   同\Z
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 指定字符开头    \Z 指定字符结尾 
2 a=re.search('\As.+n\Z','songxiaonan')
3 print(a.group())
4 a=re.search('^s.+n\Z','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' 匹配空白字符 \t  \n  \r
2 a=re.search('\s+','123SJDF   \n\r\tEDJIS')
3 print(a.group())
4 print(a)#<_sre.SRE_Match object; span=(7, 13), match='   \n\r\t'>
#分组匹配
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('.+','\nabf',flags=re.S)
3 print(a.group()) #\nabc
4 a=re.search('.+','\nabf')
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下为"\t\n",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]
 
十一、subprocess模块
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
以字符串的形式导入模块:
        __import__('模块路径名')
       __import__('模块路径名',fromlist=True)
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'>  

 

 
 
 
posted @ 2016-12-08 13:34  3456425171  阅读(290)  评论(0编辑  收藏  举报