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产生的名称空间中。
原文地址:https://www.cnblogs.com/csic716/p/11891879.html