zoukankan      html  css  js  c++  java
  • Python:Day18 os模块、logging模块、正则表达式

    迭代器

      满足迭代器协议:

        1、内部有next方法

        2、内部有iter()方法

    os模块

    import os
    print(os.getcwd())  #C:UsersLowryPycharmProjectsfullstack_s2week4day5
    os.chdir('..')   #改变当前脚本工作目录,可以写绝对路径,也可以用..表示当前目录的上级目录
    print(os.curdir)  #返回当前目录: ('.')
    print(os.pardir)  # 获取当前目录的父目录字符串名:('..')
    os.makedirs('abc/ccc/ddd')    #生成多级目录
    os.removedirs('abc/ccc')  #若目录为空,则删除目录并递规到上级目录,如果不为空,则不删除,如果最底层不为空,则报错
    os.mkdir('abc/eee')   #创建单个目录
    os.rmdir('abc/eee')   #删除单个目录,如果为空则删除,如果不为空则报错
    os.remove("abc/ccc/aaa")    #删除一个文件,只能是文件,目录不行,另外路径要对
    print(os.listdir('c:intel'))     #括号内填写路径,如果不填写默认为当前路径,路径不区分大小写
    os.rename('abc','bcd')  #重使命名一个文件或目录,前提是要用cddir命令将路径切换到文件所在的目录
    print(os.stat('./bcd')) #os.stat_result(st_mode=16895, st_ino=84442493013270541, st_dev=3026778051, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1518310074, st_mtime=1518310074, st_ctime=1518310002)
    print(os.sep)    #输出操作系统特定的路径分隔符
    print(os.linesep)   #输出当前操作系统使用的行终止符
    print(os.pathsep)   #输出用于分割文件路径的分隔符
    os.system('arp -a')   #在CMD中执行命令

    hashlib模块

    import hashlib
    m = hashlib.md5()
    m.update(b"alex")
    print(m.hexdigest())    #534b44a19bf18d20b71ecc4eb77c572f
    
    m1 = hashlib.sha256()
    m1.update("alex".encode("utf8"))
    print(m1.hexdigest())   #4135aa9dc1b842a653dea846903ddb95bfb8c5a10c504a7fa16e10bc31d1fdf0

     logging模块

    import logging
    
    logging.basicConfig(level=logging.DEBUG,    #DEBUG需要大写
                        format='%(%(asctime)s filename)s[line:%(lineno)d %(levelname)s %(message)s',    #参数之间空格显示的时候也有
                        datefmt='%a, %d %b %Y %H:%M:%S',    #如果格式中就没有时间,此项不起作用
                        filename='test.log',    #有此项日志输出到文本,无此项日志输出到屏幕
                        filemode='w')   #此项可写也可不写,不写默认为a,也就是追加模式
    
    logging.debug('this is debug message')
    logging.info('this is info message')
    logging.warning('this is warning message')
    logging.error('this is error message')
    logging.critical('this is critical message')
    '''
    Mon, 26 Feb 2018 09:02:54 logging模块.py[line:14 DEBUG this is debug message
    Mon, 26 Feb 2018 09:02:54 logging模块.py[line:15 INFO this is info message
    Mon, 26 Feb 2018 09:02:54 logging模块.py[line:16 WARNING this is warning message
    Mon, 26 Feb 2018 09:02:54 logging模块.py[line:17 ERROR this is error message
    Mon, 26 Feb 2018 09:02:54 logging模块.py[line:18 CRITICAL this is critical message
    '''

    在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有

    level:设置rootlogger(后边会讲解具体概念)的日志级别 

    format:指定handler使用的日志显示格式。 

    datefmt:指定日期时间格式。 

    filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。

    filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。

    format参数中可能用到的格式化串:

    %(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用户输出的消息

    configparser模块

    #这个模块是用来做创建和修改配置文件用的
    import configparser
    conf = configparser.ConfigParser()  #后面这个括号别忘记加了
    
    #对于section的操作(没有改这个操作)
    conf.add_section("section1")
    conf.remove_section("section1")
    conf.sections()
    
    #对于option的操作(改只能通过字典的形式操作)
    conf.set("section1","option1","value")  #这个是新增一个,如果里面以前有,程序还会创建另外一个一模一样的
    conf.remove_option("secion1","option1")
    conf.options("section1")
    conf.get("section1","option1") 

    re模块

    正则表达式:

    就基本本质而言,正则表达式是一种小型的、高度专业化的编程语言,(在python中)它内嵌在python中,并通过re模块实现

    1、正则表达式是用来干嘛的?

    答:是用来匹配 字符串的 (就是说正则和字典、列表、元组没半毛钱关系)

    string提供的方法是完全匹配

    引入正则:模糊匹配

    元字符

    . 通配符

    ^ 以...开头

    $ 以...结尾

    * 重复前面字符任意次(0~无穷次)

    + 匹配前面的字符1~无穷次

    ? 匹配前面这符(0~1次)

    {m,n} 匹配前面的字符至少m次,至多n次,也可以写成{m}代表匹配m次,也可以写成{m,}代表匹配匹配前面字符m次到无穷次

    字符集

    [ ]:匹配指定范围内的任意单个字符,另外一个作用是取消元字符的特殊功能(除了三个字符:  ^  - )

    [1,2,a,5,p]、[a-z]、[1-9]

    [^] 表示取反,[^4,5] 表示非4和非5的所有字符

    ret = re.findall('a[24,38, ,yt,bo]','a24lokreabbsa eoiwa38a4')
    print(ret)    #['a2', 'ab', 'a ', 'a3', 'a4']
    #从结果可以看出,只能匹配字符集中的一个,哪怕中间没有逗号隔开,也只能匹配其中一个,好像有没有逗号结果一样。
    
    ret = re.findall('a[2438 ytbo]','a24lokreabbsa eoiwa38a4')
    print(ret)    #['a2', 'ab', 'a ', 'a3', 'a4']
    #结果证明有没有逗号结果都是一样的,那要逗号有什么用?逗号在这里面也是一个普通字符,用于匹配后面的字符串。
    #另外建议如果不匹配逗号的话,不要加逗号,所有字符写在一起。

    :反斜杠

    反斜杠后边跟元字符去除特殊功能

    反斜杠后边跟普通字符实现特殊功能

    d  匹配任何十进制数;它相当于类[0-9]

    D 匹配任何非数字字符;它相当于类[^0-9]

    s  匹配任何空白字符;它相当于类[ f v ]

    S  匹配任何非空白字符;它相当于类[ ^ f v ]

    w  匹配任何字母数字字符;它相当于类[a-zA-Z0-9]

    W  匹配任何非字母数字字符;它相当于类[^a-zA-Z0-9]

      匹配一个字母或数字与特殊字符之间的边界,特殊字符包括:¥#,等

    ret = re.findall('\\','abcde')
    print(ret)  #['\']
    #出现这个现象的原因是,在python中也是转义的意思,\\要经过python解释器解释成\,然后将\传给re解释器。
    
    
    m = re.search(r'blow','blow')
    print(m)    #<_sre.SRE_Match object; span=(0, 4), match='blow'>
    #在python中也有特殊意思,所以前面不加r的时候匹配不到结果,在前面加个r就可以了,r的就是告诉python解释器,里面的是原生字符,不是元字符

    findall返回的是一个列表

    search返回的是一个对象,匹配出第一个满足条件的结果

    ret.group()  取出匹配的值

    ret = re.search('ab','sfabsdiowfabjkab')
    print(ret)  #<_sre.SRE_Match object; span=(2, 4), match='ab'>
    ret.group()  #取匹配的值
    print(ret.group())  #ab

    ( )

    print(re.search('(as)+','adjkfasas').group())   #asas 贪婪匹配
    print(re.search('(as)|3','3as').group())    # |表示或
    ret = re.search('(?P<id>d{3})/(?P<name>w{3})','weeew34ttt123/ooo')
    #?P为固定格式,没有具体意义,尖括号中字符是名称<名称>,用来给分组中匹配到的字符取名字,方便调取
    print(ret.group())  #123/ooo
    print(ret.group('id'))  #123
    print(ret.group('name'))    #ooo

    正则表达式的方法:

    1、findall( ) :所有结果都返回到一个列表里

    2、search( ):返回匹配到的第一个对象,对象可以调用group()返回结果

    3、match( ):只在字符串开始匹配,返回匹配到的第一个对象,对象可以调用group()返回结果

    4、split( ):将字符串分隔开,和字符串的split一样的,但功能更强大

    ret = re.split('[j,s]','sdjksal')   #先用第一个字符分,然后再用后面一个分
    print(ret)  #['', 'd', 'k', 'al'] 思考空是哪来的?

    5、sub( ):替换,和字符串中的replace功能一样,但功能更强大

    ret = re.sub('a..x','s..b','hfjasalexxdhf')  #前一个参数是规则,后一个为远的的内容,没有元字符的意义
    print(ret)  #hfjass..bxdhf
    x='ab'
    y='xxxx'
    z = 'weabcdeidos'
    print(re.sub(x,y,z))    #替换后生成一个新的值,替换的对象不做变更
    print(z)    #虽然做了替换,但Z并没有改变,字符串做替换也是一样,本原不变

    6、compile( ):编译

    obj = re.compile('.com')   #编译一个规则并赋值给一个变量
    ret = obj.findall('fhasjd.comhfajld')    #用变量调用方法,后面直接加字符串
    print(ret)  #['.com']
  • 相关阅读:
    了解NoSQL的必读资料
    SQLServer 事务、锁、阻塞
    蔡康永的说话之道
    SQL Server System Functions
    dotNet 框架程序设计 读书笔记
    SQLServer 2005 Inside Query
    学习心得LINQ to XML
    Web Service 实例
    用JAXRPC开发Web服务: Servlet作为Web服务端点
    JAVA学习推荐
  • 原文地址:https://www.cnblogs.com/sq5288/p/8424196.html
Copyright © 2011-2022 走看看