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

    本节目录

    • re
    • logging
    • os

    re

     re模块提供了正则表达式的相关操作

      是直接面向字符串的模糊匹配

      元字符包含有 . ^ $ * + ? {} [] | ()

       介绍字符

        .  通配符,除了换行符之外的任意字符

        ^   匹配字符串的开始

        $  匹配字符串的结尾

       关于次数的

        *  按紧挨着的字符重复无数次  重复零次或更多次    

        +  1到无穷次  重复一次或更多次

        ?  (0,1)  重复零次或一次

        {n}   重复n次
        {n,}  重复n次或更多次
        {n,m}重复n到m次

       其它的:

        [] 字符集  | 或  () 分组   转义  

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    . ^ $ * + ? {} 一些用法
    import re
    print(re.findall("a..x","helloalex"))#['alex']  点匹配任意一个,但是只能匹配一个
     
    print(re.findall("^a..x","alexhelloworld"))#['alex'] ^ 匹配以什么开始
     
    print(re.findall("a..x$","helloalex"))#['alex'] $ 匹配以什么结尾
     
    print(re.findall("alex*","helloalexxxxx"))#['alexxxxx'] * 贪婪匹配 *表示匹配0次或更多次
     
    print(re.findall("alex+","helloalexxx"))#['alexxx'] +表示匹配1次或更多次
     
    print(re.findall("alex?","helloalexxxx"))#['alex'] ? 表示匹配0到1次
     
    print(re.findall("alex{1,2}","alexxxx"))#['alexx']

      注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    元字符之字符集[]
    存在或的关系    至少匹配一个   在字符集中含有特殊意义的只有三个 ^(非) (转义) -(范围)
     
    print(re.findall('a[bc]d','acd'))#['acd']  []字符集中有或的概念
     
    print(re.findall('[a-z]','acd'))#['a', 'c', 'd'] #范围a—z 都可以匹配到
     
    print(re.findall('[.*+]','a.cd+'))# ['.', '+']
     
    print(re.findall('[1-9]','45dha3'))# ['4', '5', '3']
     
    print(re.findall('[^ab]','45bdha3'))# ['4', '5', 'd', 'h', '3']   ^ 代表非的概念
     
    print(re.findall('[d]','45bdha3'))# ['4', '5', '3']  d 表示0到9的数字

      

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    关于转义的实例
    import re
    ret=re.findall('cl','abcle')
    print(ret)#[]
    ret=re.findall('c\l','abcle')
    print(ret)#[]
    ret=re.findall('c\\l','abcle')
    print(ret)#['c\l']
    ret=re.findall(r'c\l','abcle')
    print(ret)#['c\l']               # 一张图解释为什么要用到这么多 的原因

    1
    2
    3
    4
    5
    6
    7
    分组() 的用法
     
    print(re.findall(r'(ad)+', 'addad')) # ['ad', 'ad']
     
    ret=re.search('(?P<id>d{2})/(?P<name>w{3})','23/com')
    print(ret.group())#23/com
    print(ret.group('id'))#23

      

    1
    2
    3
    4
    |  或
     
    ret=re.search('(ab)|d','rabhdg8sd')
    print(ret.group())#ab    先匹配到哪个取哪个  group表示取值

    re下面的方法

      常用的功能函数包括:compile、search、match、split、findall(finditer)、sub(subn)

        comoile

    1
    2
    3
    obj=re.compile('d{5}')       # compile是编译的意思,编译好一个规则,再进行调用它
    ret=obj.search('abc12345ee')
    print(ret.group())#12345

        serch

    1
    2
    3
    4
    print(re.search('al','alvin yuan').group()) # al
     
    # 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
    # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

        findall

    1
    2
    3
    print(re.findall('a','alvin yuan'))# ['a', 'a']
     
    # 返回所有满足匹配条件的结果,放在列表里

        match

    1
    2
    ret = re.match('a','abc').group() # match只是从开始匹配,匹配成功则返回对象
    print(ret)

        split

    1
    2
    ret=re.split('[ab]','abcd')     # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
    print(ret)#['', '', 'cd']       # 结果放在列表中

        sub(subn)

    1
    2
    3
    4
    ret=re.sub('d','abc','alvin5yuan6',1)   # sub里面至少有个三个参数 依次是 匹配规则 替换内容 源数据     也可以有四个,最后一个参数是匹配次数
    print(ret)#alvinabcyuan6
    ret=re.subn('d','abc','alvin5yuan6')    # 显示匹配了多少次,替换
    print(ret)#('alvinabcyuanabc', 2)

        finditer

    1
    2
    3
    4
    5
    6
    ret=re.finditer('d','ds3sy4784a')
    print(ret)        #<callable_iterator object at 0x10195f940>
    print(next(ret).group())
    print(next(ret).group())
     
    # 结合迭代器规则,返回的是一个迭代器对象,应用于处理很多的数据,用next的可以逐一取

      ?:  是取消优先级         ?P的含义

    1
    2
    print(re.search("(?P<name>[a-z]+)(?P<age>d+)","alex36wusir27").group("name"))
    # alex 注释 ?P是定义死的 <定义分组名>                                 后面可根据分组名取值
    1
    2
    3
    4
    print(re.findall("www.(baidu|taobao).com","sdaswww.baidu.comsdf"))
    # ['baidu'] 优先给分组的内容,其实已经匹配到了
    print(re.findall("www.(?:baidu|taobao).com","sdaswww.baidu.comsdf"))
    # ['www.baidu.com']    ?: 表示去掉括号内的优先级

    logging

      用于便捷记录日志且线程安全的模块

      日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。

      level=logging.DEBUG 设置日志级别

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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=logging.DEBUG)
     
    logging.debug('debug')            # 分五个等级
    logging.info('info')
    logging.warning('warning')
    logging.error('error')
    logging.critical('critical')
    logging.log(10,'log')

      文件输出如下

    format 设置输出格式

         %(levelno)s: 打印日志级别的数值
         %(levelname)s: 打印日志级别名称
         %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
         %(filename)s: 打印当前执行程序名
         %(funcName)s: 打印日志的当前函数
         %(lineno)d: 打印日志的当前行号
         %(asctime)s: 打印日志的时间
         %(thread)d: 打印线程ID
         %(threadName)s: 打印线程名称
         %(process)d: 打印进程ID
         %(message)s: 打印日志信息

    datefmt 设置日期格式,同 time.strftime()

          %Y 年 %m 月  %D日  %H时  %M分  %S 秒

    filename 设置文件路径

    filemode 设置文件打开模式 

    注:没有filename和filemode直接输出

     os

      用于提供系统级别的操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    os.getcwd()                 获取当前工作目录,即当前python脚本工作的目录路径
    os.chdir("dirname")         改变当前脚本工作目录;相当于shell下cd
    os.curdir                   返回当前目录: ('.')
    os.pardir                   获取当前目录的父目录字符串名:('..')
    os.makedirs('dir1/dir2')    可生成多层递归目录
    os.removedirs('dirname1')   若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    os.mkdir('dirname')         生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname')         删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname')       列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 ***
    os.remove()                 删除一个文件
    os.rename("oldname","new")  重命名文件/目录 ***
    os.stat('path/filename')    获取文件/目录信息,相关信息的介绍 size 文件大小 atime 上次访问时间 mtime 上次修改时间 ctime 查看创建时间
    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所指向的文件或者目录的最后修改时间

      

    上图所示,是得到

      os.path.dirname是返回上一级目录

      关于os模块的补充  

    os.walk(top, topdown=True, onerror=None, followlinks=False) 
    可以得到一个三元tupple(dirpath, dirnames, filenames), 
    第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件。
    dirpath 是一个string,代表目录的路径,
    dirnames 是一个list,包含了dirpath下所有子目录的名字。
    filenames 是一个list,包含了非目录文件的名字。
    这些名字不包含路径信息,如果需要得到全路径,需要使用os.path.join(dirpath, name).
    通过for循环自动完成递归枚举
    
    # 做个简单的例子,输出crm目录的下所有文件的路径信息
    for a,b,c in os.walk(str(PATH) + os.sep + "crm" ):
        for item in c:
            # print(item)
            print(os.path.join(a,item))
    
    输出
    F:pythoncrm.idea.name
    F:pythoncrm.ideacrm.iml
    F:pythoncrm.ideaencodings.xml
    F:pythoncrm.ideamisc.xml
    F:pythoncrm.ideamodules.xml
    F:pythoncrm.ideaworkspace.xml
    F:pythoncrminin.py
    F:pythoncrmin__init__.py
    F:pythoncrmin__pycache__in.cpython-35.pyc
    F:pythoncrmcoreadmin.py
    F:pythoncrmcorecoures.py
    F:pythoncrmcoregrade.py
    F:pythoncrmcoreschool.py
    F:pythoncrmcorestudent.py
    F:pythoncrmcore	eacher.py
    F:pythoncrmcore__init__.py
    F:pythoncrmcore__pycache__admin.cpython-35.pyc
    F:pythoncrmcore__pycache__coures.cpython-35.pyc
    F:pythoncrmcore__pycache__grade.cpython-35.pyc
    F:pythoncrmcore__pycache__school.cpython-35.pyc
    F:pythoncrmcore__pycache__student.cpython-35.pyc
    F:pythoncrmcore__pycache__	eacher.cpython-35.pyc
    F:pythoncrmcore__pycache____init__.cpython-35.pyc
    F:pythoncrmdbadminalex
    F:pythoncrmdbcoures23eeeb4347bdd26bfc6b7ee9a3b755dd
    F:pythoncrmdbcoures34d1f91fb2e514b8576fab1a75a89a6b
    F:pythoncrmdbcouresc71e8d17d41c21de0d260881d69662ff
    F:pythoncrmdbcouresdf5fb5e33c5585bb0c48107c57cece9b
    F:pythoncrmdbcourese206a54e97690cce50cc872dd70ee896
    F:pythoncrmdbgrade270c42ba7614f1a475f61dfcb397a621
    F:pythoncrmdbgrade817ee0b8010393ff3b4483e703663551
    F:pythoncrmdbschool17811d3caeff9648f48b5a553c806c63
    F:pythoncrmdbschool035c88ee6f5270ccff67a591d0e21ec
    F:pythoncrmdbschoolb0ac3d8eb8f2c2f6fe336c5e9957392
    F:pythoncrmdbschoole523d5f211747bdfc742f50463577f74
    F:pythoncrmdbstudent6e7e12c264fb3e1f456b0782f47e4af6
    F:pythoncrmdbstudenta0b5e2d3a97d7a19ec6d2da830f609b2
    F:pythoncrmdbstudenta995b03ed63f8c7128a83c984b89aa50
    F:pythoncrmdbstudentfe01b2ba5ec0146e5d4b0885822556ef
    F:pythoncrmdbstudentff4916088e836d268a9d72f8929bac06
    F:pythoncrmdb	eacher8319d4fed47c8ed828ebabd5a91563b
    F:pythoncrmdb	eacherd1d5cd3623144f692fb771580b92288
    F:pythoncrmdb	eacher5d00d0762936aedda519d63c2e4a2a40
    F:pythoncrmdb	eacher6a7ece82e4ed94a475dab275891d5036
    F:pythoncrmlibceshi.py
    F:pythoncrmlib
    eadme
    F:pythoncrmlib
    eadwrite.py
    F:pythoncrmlib__init__.py
    F:pythoncrmlib__pycache__
    eadwrite.cpython-35.pyc
    F:pythoncrmlib__pycache____init__.cpython-35.pyc
    用os.walk 遍历目录
    import os
    
    res = os.path.getsize(os.path.join("F:pythonPycharmProjectsdate2017.1.8","path_search.py"))
    print(res)
    
    ret  = os.stat(os.path.join("F:pythonPycharmProjectsdate2017.1.8","path_search.py")).st_size
    print(ret)
    
    f = open(os.path.join("F:pythonPycharmProjectsdate2017.1.8","path_search.py"),"rb")
    print(len(f.read()))
    
    输出结果相同
    获取文件大小的三种方式
  • 相关阅读:
    archlinux .bash_history
    Ubuntu环境下挂载新硬盘
    软碟通 UltraISO U启替代品 Win32DiskImager 无设备 无盘符 无u盘 无优盘 解决方案 之diskpart
    delphi Integer overflow
    MSBuild Tools offline
    delphi synedit免费的拼写检查器dll
    git 自定义命令行
    lua编译
    gcc ar
    Windows Subsystem for Linux (WSL)挂载移动硬盘U盘 卸载 c d 盘
  • 原文地址:https://www.cnblogs.com/zhangliang91/p/10547442.html
Copyright © 2011-2022 走看看