zoukankan      html  css  js  c++  java
  • CSIC_716_20191119【常用模块的用法 subprocess、re、logging、防止自动测试、包的理论】

    subprocess模块

    可以通过python代码给操作系统终端发送命令,并可以得到返回结果。

    import subprocess
    
    str = input('>>>请输入命令')
    # 使用Popen方法,需要四个参数:输入的内容;shell;stdout和stderr的默认值都是subprocess.PIPE(子进程的管道值,最大64kb)
    sub_obj = subprocess.Popen(str, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    #正确的话,输出stdout的内容,需要按照操作系统默认编码方式解码
    success = sub_obj.stdout.read().decode('gbk')
    if success:
        print(success)
    #错误的话,输出stderr的内容
    error = sub_obj.stderr.read().decode('gbk')
    if error:
        print(error)
    

    re模块

    正则表达式:

    正则表达式(Regular Expression)是一种独立的技术,很多语言都支持正则表达式。

    正则表达式的重要的元字符:

    >> 	将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符
    >> ^	匹配输入字符串开始的位置(以什么开始)
    >> $	匹配输入字符串结束的位置(以什么结束)
    >> *	匹配前面的表达式0次或多次,通常和别的元字符搭配使用
    >> +	匹配前面的表达式1次或多次,通常和别的元字符搭配使用
    >> ?	匹配前面的表达式0次或1次,
    >> {n}	匹配确定的n次,即 要匹配几次才终止,搭配使用。
    >> {n,}	至少匹配n次,
    >>{n,m}	最少匹配n次,最多匹配m次,其中n<=m
    >> ?	非贪婪匹配,匹配到就不找了,不贪。
    >> .	匹配除换行符以外的所有的字符	
    >>( )	获取括号中的匹配内容
    >>x|y	匹配x或者y
    >>[xyz]	字符集合,匹配xyz中的任何一个字符
    >>[^xyz]	匹配除xyz以外的所有字符
    >>[a-z]	字符范围,匹配a-z之间的任意字符
    >>[^a-z]	匹配范围以外的任意字符
    >>	匹配字符的边界,er  可以匹配以er结尾的单词
    >>B	匹配非字符边界,erB 可以匹配到单词中的er,但是匹配不到以er结尾的
    >>w	(小写)匹配字母数字及下划线
    >>W	(大写)匹配非字母数字及下划线
    >>d	匹配任意数字
    >>D	匹配任意非数字 
    >>
    	匹配一个换行符 换行
    >>		匹配一个制表符 空格
    

    在python中,要通过re模块才可以使用正则表达式,在提取过程中要注意转义字符

    应用场景:爬虫、数据分析、验证输入的合法性(用户名、手机号等)

    描述一波((?:(?:25[0-5]|2[0-4]d|[01]?d?d).){3}(?:25[0-5]|2[0-4]d|[01]?d?d))
    

    re模块的三种比较重要的方法:

    findall( ),可以匹配所有字符,拿到返回的结果,返回的结果是一个列表

    findall( 正则表达式要被验证的字符匹配模式),匹配模式:re.S全局匹配

    search( ),可以匹配一个字符,成功后拿到结果后就结束了,不往后匹配。生成一个对象,通过 .group()取值

    match( ),从匹配字符的开头匹配,若不是想要的内容,则返回None。 生成一个对象,通过 .group()取值

    logging模块

    应用:

    1、定义日志的存放地址logfile_path:先定位(创建)日志存放的目录,拼接日志自身的绝对路径,logfile_path就是日志的绝对路径。

    2、拷贝日志的配置字典LOGGING_DIC

    3、调用生成日志的方法

    def get_log(user_type):
        logging.config.dictConfig(LOGGING_DIC)  # 加载配置字典
        logger = logging.getLogger(user_type)  # 传参数得到结果
        return logger  # 返回结果
    
    logger = get_log('user_type')
    logger.info('日志消息')
    

    防止测试自动执行

    有很多.py文件中封装的全部都是函数,所以没必要加上

    if __name__ =='__main__':  
    

    如果a.py文件中写了非函数的正常执行语句,并且碰巧又被b.py文件作为模块导入,此时就要注意了,

    一定要在a.py文件的正常执行语句前增加上述语句。否则在导入的时候会执行,造成意料之外的内容出现。

    # func()
    # __name__属于模块名称空间中的一个名字
    # 当我们执行该模块时就会产生
    在自身执行的时候,__name__ = __main__
    在被其他模块调用时,__name__ = 包.模块名
    

    包的理论

    导入包的时候发生的事情:

    当包被导入的时候,会以包中的__init__.py来产生一个名称空间。。
    执行__init__.py文件时,会将__init__.py中的所有名字加载到名称空间中。-->init.py自身文件中的名字
    接着,包下所有的模块的名字都会加载到__init__.py产生的名称空间中。-->init.py统辖的模块的名字
    导入模块指向的名称空间其实就是__init__.py产生的名称空间中。
    
  • 相关阅读:
    js 的防抖与节流
    Vue---图形二维码、rules校验规则、el-dialog展示图片
    vue ----弹框
    vue的背景加载--旋转*号
    利用ES6新特性将时间戳转换为yyyy-mm-dd格式
    路由守卫之离开守卫
    Java的运行环境与开发环境
    list<map<string,object>> 按照某字段排序
    没有CSRF保护的HTML表单 漏洞解决办法
    通过mybatis-plus的分页插件,实现分页
  • 原文地址:https://www.cnblogs.com/csic716/p/11891879.html
Copyright © 2011-2022 走看看