• 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('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模块
    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'>  
     
     
     
  • 相关阅读:
    JMS(面向消息中间件)
    ActiveMQ消息中间件知识汇总
    linux安装mysql常见命令
    结果集耗尽时,检查是否关闭结果集时常用sql
    Spring注解驱动开发之事务概念
    nginx 基础
    HTTP原理
    MYSQL----cmake 数据库出错
    php安装Phalcon模块
    docker报错 Failed to start Docker Application Container Engine.
  • 原文地址:https://www.cnblogs.com/songxiaonan/p/6074043.html
Copyright © 2020-2023  润新知