zoukankan      html  css  js  c++  java
  • 常用模块

    一、time模块

    1.时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型

    print(time.time())时间戳 

    2.格式化的时间字符串(Format String)

    #格式化的字符串
    # print(time.strftime('%Y-%m-%d %H:%M:%S'))
    # print(time.strftime('%Y-%m-%d %X'))
    

    3.结构化的时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)

     

    结构化的时间
    # print(time.localtime())
    # print(time.localtime().tm_year)
    # print(time.gmtime())
    print(time.localtime(1496807630))#将unixtime时间转换成各式话时间
    结果:
    time.struct_time(tm_year=2017, tm_mon=6, tm_mday=7, tm_hour=11, tm_min=53, tm_sec=50, tm_wday=2, tm_yday=158, tm_isdst=0)
    
    print(time.strftime('%Y %X',time.localtime()))
    
    结果:
    2017 12:01:41
    
    print(time.strptime('2017-06-04 11:59:59','%Y-%m-%d %X'))
    结果:
    time.struct_time(tm_year=2017, tm_mon=6, tm_mday=4, tm_hour=11, tm_min=59, tm_sec=59, tm_wday=6, tm_yday=155, tm_isdst=-1)
    
    print(time.ctime(123123132))
    结果:Mon Nov 26 08:52:12 1973
    print(time.asctime(time.localtime()))
    结果:Wed Jun  7 12:03:44 2017

    二、random模块 

    从列表中随机选出一个ip地址,应用场景爬虫
    import random
    proxy_ip=[
        '1.1.1.1',
        '1.1.1.2',
        '1.1.1.3',
        '1.1.1.4',
    ]
    ip=random.choice(proxy_ip)
    print(ip)
    

      

    # import random
    # print(random.sample([1,'23',[4,5]],2))#随机做两个组合
    # 结果:[1, '23']
    
    #验证码
    def v_code(n=5):
        res=''
        for i in range(n):#n长度
            num=random.randint(0,9)#0-9的数字
            s=chr(random.randint(65,90))#65-90是a到z的asell码
            add=random.choice([num,s])#从num和s中选出一个
            res+=str(add)#拼接字符
        return res
    
    print(v_code(6))
    

      

    import random
     
    print(random.random())#(0,1)----float    大于0且小于1之间的小数
     
    print(random.randint(1,3))  #[1,3]    大于等于1且小于等于3之间的整数
     
    print(random.randrange(1,3)) #[1,3)    大于等于1且小于3之间的整数
     
    print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5]
     
    print(random.sample([1,'23',[4,5]],2))#列表元素任意2个组合
     
    print(random.uniform(1,3))#大于1小于3的小数,如1.927109612082716 
     
     
    item=[1,3,5,7,9]
    random.shuffle(item) #打乱item的顺序,相当于"洗牌"
    print(item)
    

    三、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    输出用于分割文件路径的字符串 win下为;,Linux下为:
    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所指向的文件或者目录的最后修改时间
    os.path.getsize(path) 返回path的大小
    

     

    os路径处理
    #方式一:推荐使用
    import os
    #具体应用
    import os,sys
    #获取项目的跟目录的两种方式 possible_topdir = os.path.normpath(os.path.join( os.path.abspath(__file__), os.pardir, #上一级 os.pardir, os.pardir )) sys.path.insert(0,possible_topdir) #方式二:不推荐使用 os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

    四、sys模块 

    1 sys.argv           命令行参数List,第一个元素是程序本身路径
    2 sys.exit(n)        退出程序,正常退出时exit(0)
    3 sys.version        获取Python解释程序的版本信息
    4 sys.maxint         最大的Int值
    5 sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    6 sys.platform       返回操作系统平台名称
    import sys,time
    
    for i in range(50):
        sys.stdout.write('%s
    ' %('#'*i))
        sys.stdout.flush()
        time.sleep(0.1)
    
    '''
    注意:在pycharm中执行无效,请到命令行中以脚本的方式执行
    '''

    五 shutil模块

    1.将文件内容拷贝到另一个文件中

    import shutil
    
    shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
    

    2.拷贝文件

    shutil.copyfile('f1.log', 'f2.log') #目标文件无需存在
    

    3.仅拷贝权限。内容、组、用户均不变

    shutil.copymode('f1.log', 'f2.log') #目标文件必须存在
    

    4.shutil.copystat(src, dst)
    仅拷贝状态的信息,包括:mode bits, atime, mtime, flags 

    shutil.copystat('f1.log', 'f2.log') #目标文件必须存在
    

      

     

    5.shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:  

    import tarfile
    
    # 压缩
    >>> t=tarfile.open('/tmp/egon.tar','w')
    >>> t.add('/test1/a.py',arcname='a.bak')
    >>> t.add('/test1/b.py',arcname='b.bak')
    >>> t.close()
    
    
    # 解压
    >>> t=tarfile.open('/tmp/egon.tar','r')
    >>> t.extractall('/egon')
    >>> t.close()
    
    tarfile压缩解压缩
    

    六 json&pickle模块

    1.json

    1.1json在python中的应用

    在python中有些时候eval也可和json.load同样的功能但是遇到特殊的字符入Null,eval就无法转换了这时候就必须用json模块。

    import json
    x="[null,true,false,1]"
    print(eval(x)) #报错,无法解析null类型,而json就可以
    print(json.loads(x)) 
    

    1.2 什么是序列化

    我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。

    import json
    #序列化的过程:dic---->res=json.dumps(dic)---->f.write(res)
    dic={
        'name':'alex',
        'age':9000,
        'height':'150cm',
    }
    
    res=json.dumps(dic)
    print(res,type(res))
    with open('a.json','w') as f:
        f.write(res)
    

    1.2 为什么要序列化

    1:持久保存状态

    需知一个软件/程序的执行就在处理一系列状态的变化,在编程语言中,'状态'会以各种各样有结构的数据类型(也可简单的理解为变量)的形式被保存在内存中。

    内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(有结构)都被清空了。

    在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。

    具体的来说,你玩使命召唤闯到了第13关,你保存游戏状态,关机走人,下次再玩,还能从上次的位置开始继续闯关。或如,虚拟机状态的挂起等。

    2:跨平台数据交互

    序列化之后,不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互。

    反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

    json

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

    JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:

    import json
    #反序列化的过程:res=f.read()---->res=json.loads(res)---->dic=res
    with open('a.json','r') as f:
        dic=json.loads(f.read())
        print(dic,type(dic))
        print(dic['name'])
    

    json操作 

    #json的便捷操作
    import json
    dic={
        'name':'alex',
        'age':9000,
        'height':'150cm',
    }
    json.dump(dic,open('b.json','w'))
    

    2.pickle

    import pickle
     
    dic={'name':'alvin','age':23,'sex':'male'}
     
    print(type(dic))#<class 'dict'>
     
    j=pickle.dumps(dic)
    print(type(j))#<class 'bytes'>
     
     
    f=open('序列化对象_pickle','wb')#注意是w是写入str,wb是写入bytes,j是'bytes'
    f.write(j)  #-------------------等价于pickle.dump(dic,f)
     
    f.close()
    #-------------------------反序列化
    import pickle f=open('序列化对象_pickle','rb') data=pickle.loads(f.read())# 等价于data=pickle.load(f)
    print(data['age'])
    pickle.load(open('c.pkl','rb'))

    json 和pickle对比

    import pickle
    
    # dic={'name':'alex','age':13}
    
    # print(pickle.dumps(dic))
    # with open('a.pkl','wb') as f:
    #     f.write(pickle.dumps(dic))
    
    # with open('a.pkl','rb') as f:
    #     d=pickle.loads(f.read())
    #     print(d,type(d))
    
    
    
    # dic={'name':'alex','age':13}
    # pickle.dump(dic,open('b.pkl','wb'))
    # res=pickle.load(open('b.pkl','rb'))
    # print(res,type(res))
    
    
    #
    import json
    import pickle
    # def func():
    #     print('from func')
    
    # json.dumps(func)# 报错,json不支持python的函数类型
    # f=pickle.dumps(func)
    # print(f)
    
    # pickle.dump(func,open('c.pkl','wb'))
    # res=pickle.load(open('c.pkl','rb'))
    # print(res)
    # res()
    

      Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系  

    七 shelve模块

    import shelve
    
    f=shelve.open(r'sheve.txt')
    f['fff']={'name':'egon','age':18,'height':'180cm'}
    print(f['fff']['name'])
    f.close()
    

    八 xml模块

    <?xml version="1.0"?>
    <data>
        <country name="Liechtenstein">
            <rank updated="yes">2</rank>
            <year>2008</year>
            <gdppc>141100</gdppc>
            <neighbor name="Austria" direction="E"/>
            <neighbor name="Switzerland" direction="W"/>
        </country>
        <country name="Singapore">
            <rank updated="yes">5</rank>
            <year>2011</year>
            <gdppc>59900</gdppc>
            <neighbor name="Malaysia" direction="N"/>
        </country>
        <country name="Panama">
            <rank updated="yes">69</rank>
            <year>2011</year>
            <gdppc>13600</gdppc>
            <neighbor name="Costa Rica" direction="W"/>
            <neighbor name="Colombia" direction="E"/>
        </country>
    </data>
    
    xml数据
    
    # print(root.iter('year')) #全文搜索
    # print(root.find('country')) #在root的子节点找,只找一个
    # print(root.findall('country')) #在root的子节点找,找所有
    
    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,child.attrib['name'])
        for i in child:
            print(i.tag,i.attrib,i.text)
     
    #只遍历year 节点
    for node in root.iter('year'):
        print(node.tag,node.text)
    #---------------------------------------
    
    import xml.etree.ElementTree as ET
     
    tree = ET.parse("xmltest.xml")
    root = tree.getroot()
     
    #修改
    for node in root.iter('year'):
        new_year=int(node.text)+1
        node.text=str(new_year)
        node.set('updated','yes')
        node.set('version','1.0')
    tree.write('test.xml')
     
    
     
    #删除node
    for country in root.findall('country'):
       rank = int(country.find('rank').text)
       if rank > 50:
         root.remove(country)
     
    tree.write('output.xml')
    
    #在country内添加(append)节点year2
    import xml.etree.ElementTree as ET
    tree = ET.parse("a.xml")
    root=tree.getroot()
    for country in root.findall('country'):
        for year in country.findall('year'):
            if int(year.text) > 2000:
                year2=ET.Element('year2')
                year2.text='新年'
                year2.attrib={'update':'yes'}
                country.append(year2) #往country节点下添加子节点
    
    tree.write('a.xml.swap')
    

      

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

      

    九 configparser模块

    import configparser
    
    config=configparser.ConfigParser()
    config.read('a.cfg')
    
    
    #删除整个标题section2
    config.remove_section('section2')
    
    #删除标题section1下的某个k1和k2
    config.remove_option('section1','k1')
    config.remove_option('section1','k2')
    
    #判断是否存在某个标题
    print(config.has_section('section1'))
    
    #判断标题section1下是否有user
    print(config.has_option('section1',''))
    
    
    #添加一个标题
    config.add_section('egon')
    
    #在标题egon下添加name=egon,age=18的配置
    config.set('egon','name','egon')
    config.set('egon','age',18) #报错,必须是字符串
    
    
    #最后将修改的内容写入文件,完成最终的修改
    config.write(open('a.cfg','w'))
    

    test.ini配置文件

    # 注释1
    ; 注释2
    
    [section1]
    k1 = v1
    k2:v2
    db=pymysql+mysql://egon:123@192.168.2.3/db1
    max_conn=30
    enable=0
    [section2]
    k1 = v1
    

    1.获取所以节点 

    import configparser
    config=configparser.ConfigParser()
    config.read('test.ini')#获取所以节点
    print(config.sections())
    结果:['section1', 'section2']
    

    2.获取节点下的所以键值对

    import configparser
    config=configparser.ConfigParser()
    config.read('a.ini',encoding='utf-8')
    res=config.items('section1')
    print(res)
    结果:[('k1', 'v1'), ('k2', 'v2'), ('db', 'pymysql+mysql://egon:123@192.168.2.3/db1'), ('max_conn', '30'), ('enable', '0')]
    

    3.获取指定节点下的所有key

    config=configparser.ConfigParser()
    config.read('a.ini',encoding='utf-8')
    res=config.options('section1')
    print(res)
    结果:['k1', 'k2', 'db', 'max_conn', 'enable']

    4 获取指定节点下指定key的值

    import configparser
    config=configparser.ConfigParser()
    config.read('test.ini',encoding='utf-8')
    res1=config.get('bitbucket.org','user')
    
    res2=config.getint('topsecret.server.com','port')
    res3=config.getfloat('topsecret.server.com','port')
    res4=config.getboolean('topsecret.server.com','ForwardX11')
    
    print(res1)
    print(res2)
    print(res3)
    print(res4)
    
    '''
    打印结果:
    hg
    50022.0
    False
    '''
    

    5 检查、删除、添加节点

    import configparser
    #检查节点 config=configparser.ConfigParser() config.read('a.ini',encoding='utf-8') has_sec=config.has_section('section1')检查是否存在节点
    print(config.has_option('section1','enable'))检查某个节点下是否存在key
    print(has_sec)#
    
    #添加修改
    config.add_section('egon')
    config.set('egon','han','18')#如果存在修改
    config['egon']['han']='28'
    config.write(open('m.ini','w'))

    #删除节点
    config.remove_section('egon')
    config.write(open('test.ini','w'))

    6 检查、删除、设置指定组内的键值对 

    import configparser
    config=configparser.ConfigParser()
    config.read('m.ini',encoding='utf-8')
    
    #检查
    has_sec=config.has_option('section2','k1') #bsection2下有一个键k1
    print(has_sec) #打印True
    
    #删除节点下的key
    config.remove_option('section2','k1')删除section2节点下的k1
    config.write(open('m.ini','w'))
    
    #设置
    config.set('section1','k1','han')#设置section1节点下k1 的值位han
    config.write(open('m.ini','w'))
    

     

    十 hashlib模块

    hash:一种算法 ,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
    三个特点:
    1.内容相同则hash运算结果相同,内容稍微改变则hash值则变
    2.不可逆推
    3.相同算法:无论校验多长的数据,得到的哈希值长度固定。

    1.加密

    m=hashlib.md5()
    m.update('123456'.encode('utf-8'))
    print(m.hexdigest())
    
    得到的md5值:e10adc3949ba59abbe56e057f20f883e


    import hashlib
    m=hashlib.md5()
    m.update('12'.encode('utf-8'))#累加进去的
    m.update('3456'.encode('utf-8'))
    print(m.hexdigest()) #e10adc3949ba59abbe56e057f20f883e

    2.将文件内容加密

    import hashlib
    m=hashlib.md5()
    with open('md','rb') as f:
        for line in f:
            print(line.strip())
            m.update(line.strip())#相当于把文档的内容追加是累加
            md5_num=m.hexdigest()
            print(md5_num)#
    
    结果:
    b'1'
    c4ca4238a0b923820dcc509a6f75849b
    b'2'
    c20ad4d76fe97759aa27a0c99bff6710
    b'3'
    202cb962ac59075b964b07152d234b70
    b'4'
    81dc9bdb52d04dc20036dbd8313ed055
    b'5'
    827ccb0eea8a706c4c34a16891f84e7b
    b'6'
    e10adc3949ba59abbe56e057f20f883e
    

    3.sha256 hashlib的升级比原有的为数要长

    import hashlib
    s=hashlib.sha256()
    s.update('123456'.encode('utf-8'))
    print(s.hexdigest())

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

    4.撞库

    import hashlib
    passwod=['123456','12345678','123456789']
    def make_pass(passwod):
        dic={}
        for pwd in passwod:
            m=hashlib.md5()
            m.update(pwd.encode('utf-8'))
            dic[pwd]=m.hexdigest()
        return dic
    
    def code(c,pwd_dic):
        for k,v in pwd_dic.items():
            if v ==c:
                print('密码是%s'%k)
    code('e10adc3949ba59abbe56e057f20f883e',make_pass(passwod))
    

    十一 suprocess模块

    运行python的时候,我们都是在创建并运行一个进程。像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序。
    subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用。另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。

    # import subprocess
    #
    # res=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
    # print(res)
    # print(res.stdout.read().decode('gbk'))
    
    
    import subprocess
    
    # res=subprocess.Popen('diasdfasdfr',shell=True,
    #                      stderr=subprocess.PIPE,
    #                      stdout=subprocess.PIPE)
    
    # print('=====>',res.stdout.read())
    # print('=====>',res.stderr.read().decode('gbk'))
    
    
    #ls |grep txt$
    res1=subprocess.Popen(r'dir E:wupeiqis17day06',shell=True,stdout=subprocess.PIPE)
    # print(res1.stdout.read())
    
    res=subprocess.Popen(r'findstr txt*',shell=True,
                         stdin=res1.stdout,
                         stderr=subprocess.PIPE,
                         stdout=subprocess.PIPE)
    
    print('===>',res.stdout.read().decode('gbk'))#管道取一次就空了
    print('===>',res.stdout.read().decode('gbk'))
    print('===>',res.stdout.read().decode('gbk'))
    print('===>',res.stdout.read().decode('gbk'))
    print('===>',res.stdout.read().decode('gbk'))
    print('===>',res.stdout.read().decode('gbk'))
    print('===>',res.stdout.read().decode('gbk'))
    

     

    十二 logging模块

    import logging
    '''
    一:如果不指定filename,则默认打印到终端
    二:指定日志级别:
        指定方式:
            1:level=10
            2:level=logging.ERROR
    
        日志级别种类:
            CRITICAL = 50
            FATAL = CRITICAL
            ERROR = 40
            WARNING = 30
            WARN = WARNING
            INFO = 20
            DEBUG = 10
            NOTSET = 0
    
    三:指定日志级别为ERROR,则只有ERROR及其以上级别的日志会被打印
    '''
    
    
    logging.basicConfig(filename='access.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') #如果level=40,则只有logging.critical和loggin.error的日志会被打印
    

    可在logging.basicConfig()函数中通过具体参数来更改logging模块默认行为,可用参数有
    filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
    filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    format:指定handler使用的日志显示格式。 
    datefmt:指定日期时间格式。 
    level:设置rootlogger(后边会讲解具体概念)的日志级别 
    stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。点击查看更详细

    日志格式

    %(name)s

    Logger的名字,并非用户名,详细查看

    %(levelno)s

    数字形式的日志级别

    %(levelname)s

    文本形式的日志级别

    %(pathname)s

    调用日志输出函数的模块的完整路径名,可能没有

    %(filename)s

    调用日志输出函数的模块的文件名

    %(module)s

    调用日志输出函数的模块名

    %(funcName)s

    调用日志输出函数的函数名

    %(lineno)d

    调用日志输出函数的语句所在的代码行

    %(created)f

    当前时间,用UNIX标准的表示时间的浮 点数表示

    %(relativeCreated)d

    输出日志信息时的,自Logger创建以 来的毫秒数

    %(asctime)s

    字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒

    %(thread)d

    线程ID。可能没有

    %(threadName)s

    线程名。可能没有

    %(process)d

    进程ID。可能没有

    %(message)s

    用户输出的消息

    十三 re模块

    一:什么是正则?

     正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

    生活中处处都是正则:

        比如我们描述:4条腿

          你可能会想到的是四条腿的动物或者桌子,椅子等

        继续描述:4条腿,活的

              就只剩下四条腿的动物这一类了

    二:常用匹配模式(元字符)

    1.w匹配字符数字下划线
        print(re.findall('w','as213df_*|'))
        
    结果:
    ['a', 's', '2', '1', '3', 'd', 'f', '_']
    
    2.W匹配非字符数字下划线
        print(re.findall('W','as213df_*|'))
    结果:
    ['*', '|']
    
    3.print(re.findall('awb','a_b a3b aEb a*b'))#匹配a b直接的匹配字符数字下划线
    结果:
    ['a_b', 'a3b', 'aEb']
    
    4.匹配任意空白字符 等价于【	
    
    f】
    print(re.findall('s','a b
    c	d'))
    结果
    [' ', '
    ', '	']
    5.S匹配任意非空字符
    print(re.findall('S','a b
    c	d'))
    结果
    ['a', 'b', 'c', 'd']
    6.匹配任意数字,等价于[0-9]
    print(re.findall('d','a123bcdef'))
    结果
    ['1', '2', '3']
    7.D匹配任意非数字
    print(re.findall('D','a123bcdef'))
    结果
    ['a', 'b', 'c', 'd', 'e', 'f']
    8.匹配字符
    
    print(re.findall('
    ','a123
    bc
    def'))
    结果
    ['
    ', '
    ']
    9.匹配	
    print(re.findall('	','a123	bc	d	ef'))
    结果
    ['	', '	', '	']
    10.匹配字符 ‘h’
    print(re.findall('^h','hello egon hao123'))
    结果
    [‘h’]
    
    print(re.findall('^h','hello egon hao123'))
    结果
    []
    11.匹配字符串末尾
    print(re.findall('3$','e3ll3o e3gon hao123'))
    结果
    ['3']
    12 匹配任意字符除了换行
    #匹配a和b中件除了换行的任意字符
    print(re.findall('a.c','abc a1c a*c a|c abd aed ac'))
    结果
    ['abc', 'a1c', 'a*c', 'a|c']
    print(re.findall('a.c','abc a1c a*c a|c abd aed a
    c',re.S)) #让点能够匹配到换行符
    结果
    ['abc', 'a1c', 'a*c', 'a|c', 'a
    c']

    13.
    #匹配a开头包含“1”,"2",“ ” 并且以c结尾的字符
    print(re.findall('a[1,2 ]c','a2c a,c abc a1c a*c a|c abd aed a c'))
    结果
    ['a2c', 'a,c', 'a1c', 'a c']
    14.匹配a开头包含0-9并且c结尾的字符
    print(re.findall('a[0-9]c','a2c a11c abc a1c a*c a|c abd aed a
    c'))

    结果['a2c', 'a1c']

    15.匹配开头a包含0-9 a-z A-Z * -并且以c结尾的字符
    print(re.findall('a[0-9a-zA-Z*-]c','a1c abc a*c a-c aEc a-1c'))
    结果:['a1c', 'abc', 'a*c', 'a-c', 'aEc']

    16.a开头b结尾不包含0-9数字的字符
    print(re.findall('a[^0-9]c','a1c a2c a*c a-c aEc'))
    结果:['a*c', 'a-c', 'aEc']

    17.匹配以a开头b最少0最大无线
    print(re.findall('ab*','a ab b'))
    结果
    print(re.findall('ab*','a ab baaa abbbbbbbbbbbbbbbb  ac'))

    print(re.findall('ab*','bbbbbb'))
    结果[]
    18.“+” a开头b最少得有一个
    print(re.findall('ab+','a'))
    结果:[]
    print(re.findall('ab+','bbbbbb'))
    结果:[]
    19.ab开头结尾包含1或者2或者3
    print(re.findall('ab[123]','ab1 ab2 ab3 bbbbb1'))
    结果['ab1', 'ab2', 'ab3']

    20.ab开头1、2、3结尾最少包含1个
    print(re.findall('ab[123]+','ab11111111 ab2 ab3 abc1'))
    结果:['ab11111111', 'ab22222222', 'ab3']

    print(re.findall('ab[123]+','ab1 ab2 ab3 ab4 ab123'))
    结果:['ab1', 'ab2', 'ab3', 'ab123']

    print(re.findall('ab[123][123][123]','ab1 ab2 ab3 ab4 ab123'))
    结果:

    ['ab123']

    21.

    print(re.findall('ab{3}','ab1 abbbbbbbb2 abbbbb3 ab4 ab122'))#限制b的长度
    结果:['abbb', 'abbb']

    print(re.findall('ab{0,}','a123123123 ab1 abbb123 abbbbbbb123 abbbbbtb'))#b 0个到无穷大

    结果:['a', 'ab', 'abbb', 'abbbbbbb', 'abbbbb']

    print(re.findall('ab{2,}','a123123123 ab1 abb123 abbbb123 abbbbbt'))
    结果:['abb', 'abbbb', 'abbbbb']
    22.
    print(re.findall('a.*c','a2c abc aec a1c'))#贪婪方式匹配a和c之间除了换行任何字符
    结果:['a2c abc aec a1c']

    23.
    print(re.findall('a.*?c','ac abc aec a1c'))#a到c之间任意字符
    结果:['ac', 'abc', 'aec', 'a1c']
    print(re.findall('a.*?c','ac abc a111111111c a c a1c',re.S))# 需要转意
    结果:['ac', 'abc', 'a111111111c', 'a c', 'a1c']
    24.()分组

    #(y|ies)找到y和ies结尾的
    print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company'))
    结果:['companies', 'company'print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab
    结果:['ab']
    print(re.findall('(?:ab)+123','ababab123'))
    结果:['ababab123']
    print(re.findall(r'a\c','ac')) #r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义
    结果:['a\c']

    print(re.findall('a\\c','ac')) #r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义
    print(re.findall(r'a\c','ac')) #r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义
    print(re.findall('a\\c','ac')) #同上面的意思一样,和上面的结果一样都是['a\c']
     
    re.search:会扫描整个字符串,不会从头开始,找到第一个匹配的结果就会返回
    print(re.match('a','aleaa make love').group())
    content='Extra strings Hello 123 456 World_This is a Regex Demo Extra strings'
    res=re.search('Hello.*?(d+).*?Demo',content) #
    print(res.group(1)) #输出结果为
    res=re.findall('a','aadddacccaa')#findall找到所以符合条件的结果
    for i in res:
    print(i)

    print(re.split('[ab]','abcd'))


    #re.sub:字符串替换
    import re
    content='Extra strings Hello 123 456 World_This is a Regex Demo Extra strings'
    
    # content=re.sub('d+','',content)
    # print(content)
    print(re.sub('^a','A','alex make love'))#以a为开头的替换
    print(re.sub('a','A','alex make love'))#替换所以a
    print(re.sub('^(w+)(s)(w+)(s)(w+)',r'52341','alex make love'))#love make alex
    # print(re.sub('^(w+)(s+)(w+)(s+)(w+)',r'5','alex make love'))
    # print(re.sub('^(w+)(W+)(w+)(W+)(w+)',r'52341','alex " + = make ----/== love'))#
    跟findall区别就是search找到companies就返回就不会再找了只返回一个
    # print(re.search('companies|company','my company is already done,all companies will be done').group())
    #用1取得第一个括号的内容
    #用法:将123与456换位置
    # import re
    # content='Extra strings Hello 123 456 World_This is a Regex Demo Extra strings'
    #
    # # content=re.sub('(Extra.*?)(d+)(s)(d+)(.*?strings)',r'14325',content)
    # content=re.sub('(d+)(s)(d+)',r'321',content)
    # print(content)
    # print(re.findall(r'-?d+.d+|(-?d+)',"1-2*(60+(-40.35/5.3+1.2)-(-4*3))"))

    s='''
    你好啊 alex 大傻逼
    alex的邮箱是3781231123@qq.com
    010-18211413111
    378533872

    '''

    print(re.findall(r"[1-9][0-9]{4,}",s))
     
  • 相关阅读:
    各种有趣言论收集
    人类未来进化方向恶考
    mysql 列所有表行数
    恩,有那么一个人
    00后厉害哇
    。。。。
    放弃微博,继续回来写月经
    嘿,大家还好吗
    git
    require js
  • 原文地址:https://www.cnblogs.com/hanjialong/p/6957232.html
Copyright © 2011-2022 走看看