Python全栈开发之常用模块

发布时间:2020-07-30 06:33:30 作者:灰白世界
来源:网络 阅读:1097

No.1 sys

sys模块是与Python解释器交互的一个接口

No.2 os

os模块是与操作系统交互的一个接口

No.3 re

re模块的使用过程

# 导入re模块
import re
# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)
# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()

匹配单个字符

字符 功能
. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配单词字符,即a-z、A-Z、0-9、_
\W 匹配非单词字符

匹配多个字符

字符 功能
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,n} 匹配前一个字符出现从m到n次

匹配开头或结尾

字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾

匹配分组

字符 功能
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P<name>) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串

match 仅仅查找第一个位置,如果找不到,返回None

import re
result = re.match("kernel","kernel.cn")
result.group()result = re.match("kernel","kernel.cn")
result.group() # kernel

serach 仅仅返回一个结果

import re
ret = re.search(r"\d+", "阅读次数为 9999")
ret.group() # 9999

findall 返回最多能匹配的个数

import re

ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret) # ['9999', '7890', '12345']

sub 将匹配到的数据进行替换

import re

ret = re.sub(r"\d+", '998', "python = 997")
print(ret) # Python = 998

贪婪和非贪婪

正则表达式模式中使用到通配字,那它在从左到右的顺序求值时,会尽量抓取满足匹配最长字符串,在我们上面的例子里面,+会从字符串的启始处抓取满足模式的最长字符,其中包括我们想得到的第一个整型字段的中的大部分,\d+只需一位字符就可以匹配,而+则匹配了从字符串起始符合规则的所有字符,解决方式就是非贪婪操作符?,这个操作符可以用在*、+、?的后面,要求正则匹配的越少越好

r的作用

Python中字符串前面加上 r 表示原生字符串,与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰,假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠,Python里的原生字符串很好地解决了这个问题,有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直

No.4 time

时间处理模块

time模块的几种转换方式

时间戳转换为结构化时间

结构化时间转化为时间戳

结构化时间转化为字符串时间

字符串时间转化为结构化时间

No.5 timedate

日期处理模块

No.6 json

只能适用于Python的基本数据类型,跨语言

No.7 pickle

适用于Python的所有数据类型,但是只针对Python

No.8 logging

日志处理模块

日志的级别
默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG)

日志的配置

logging.basicConfig(level=logging.DEBUG,  
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  
                    datefmt='%a, %d %b %Y %H:%M:%S',  
                    filename='/tmp/test.log',  
                    filemode='w')  
logging.debug('debug message')  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message')

配置参数

logger对象配置

logger = logging.getLogger('kernel') # 创建logging对象
logger.setLevel(logging.DEBUG) # 指定全局被处理消息级别(全局处理消息级别要高于或等于局部消息处理级别)

ch = logging.StreamHandler() # 屏幕流
ch.setLevel(logging.DEBUG) # 指定局部被处理消息级别

fh = logging.FileHandler("access.log") # 文件流
fh.setLevel(logging.WARNING) # 指定局部被处理消息级别

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 创建时间格式

ch.setFormatter(formatter) # 设置屏幕流时间格式
fh.setFormatter(formatter) # 设置文本流时间格式

logger.addHandler(ch) # 将屏幕流对象添加到logger中
logger.addHandler(fh) # 将文本流对象添加到logger中

logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

No.9 hashlib

加密模块

obj = hashlib.md5() # 创建hashlib对象
obj = hashlib.md5(bytes('kernel',encoding='utf-8')) # 创建hashlib对象并加言
obj.update(bytes('hello',encoding='utf-8')) # 加密
ret = obj.hexdigest() # 获取密文

No.10 configparser

操纵配置文件模块

import configparser
cfg = configparser.ConfigParser() # 创建configparser对象
cfg.read('conf',encoding='utf-8') # 读取配置文件

secs = cfg.sections() # 获取所有节点
print(secs)

options = cfg.options(secs[0]) # 获取指定节点的所有key
print(options)

item = cfg.items(secs[0]) # 获取指定节点的键值对组合
print(item)

val = cfg.get(secs[0],options[0]) # 获取指定节点下的指定key的值
print(val)

sec = cfg.remove_section(secs[0]) # 删除指定节点
cfg.write(open('conf','w'))
print(sec)

sec = cfg.has_section('jiedian1') # 检查是否存在该节点
print(sec)
sec = cfg.add_section('jiedian1') # 添加该节点
cfg.write(open('conf','w'))
print(sec)

cfg.set(secs[0],options[0],'111') # 修改指定节点下指定key的值
cfg.write(open('conf','w'))

cfg.remove_option(secs[0],options[0]) # 删除指定节点下指定键值对
cfg.write(open('conf','w'))

No.11 XML

from xml.etree import ElementTree as ET
from xml.dom import minidom

# 修改XML
"""
解析XML的方式有两种
1.解析字符串方式
将字符串解析成XML对象,root代指XML文件的根节点
str_xml = open('xo.xml', 'r').read()
root = ET.XML(str_xml)
2.解析文件方式
获取xml文件的根节点
tree = ET.parse("xo.xml")
root = tree.getroot()
"""

# 遍历XML的所有内容
et = ET.parse('conf.xml')
root = et.getroot() # 获取根节点
print(root)

print(root.tag) # 顶层标签

for child in root: # 遍历XML文档的第二层
    print(' ' + child.tag,child.attrib) # 第二层节点的标签名和标签属性
    for i in child: # 遍历XML文档的第三层
        print('     ' + i.tag,i.attrib) # 第三层节点的标签名和标签属性
        print('         ' + str(i.text)) # 第三层节点的属性

# 遍历XML的指定节点
for node in root.iter('year'): # 遍历XML的所有year节点
    print(node.tag, node.text) # 节点的标签名称和内容

# 节点的标签名称和内容并修改节点内容
for node in root.iter('year'): # 遍历XML的所有year节点
    print(node.tag, node.text) # 节点的标签名称和内容
    new_year = int(node.text) + 1 # 将year节点的内容增加1
    node.text = str(new_year)
    node.set('name', 'kernel') # 设置属性和值
    node.set('age', '18')
    del node.attrib['name'] # 删除属性

# 删除节点
for country in root.findall('country'): # 遍历data下的所有country节点
    rank = int(country.find('rank').text) # 获取每一个country节点下rank节点的内容
    if rank > 50:
        root.remove(country)  # 删除指定country节点

"""
保存XML文件的方式也有两种
1.解析字符串方式
tree = ET.ElementTree(root)
tree.write("newnew.xml", encoding='utf-8')
2.解析文件方式
tree.write("new.xml",encoding='utf-8')
"""

# 创建XML文件
# 方式一
root = ET.Element("famliy")

son1 = ET.Element('son', {'name': '大儿子'}) # 创建大儿子节点
son2 = ET.Element('son', {"name": '二儿子'}) # 创建二儿子节点

grandson1 = ET.Element('grandson', {'name': '大孙子'}) # 在大儿子中创建两个孙子
grandson2 = ET.Element('grandson', {'name': '二孙子'})

son1.append(grandson1) # 将孙子添加到儿子节点中
son1.append(grandson2)

root.append(son1) # 把儿子添加到根节点中
root.append(son1)

tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)

# 方式二
root = ET.Element("famliy")

son1 = root.makeelement('son', {'name': '大儿子'}) # 创建大儿子节点
son2 = root.makeelement('son', {"name": '二儿子'}) # 创建二儿子节点

grandson1 = root.makeelement('grandson', {'name': '大孙子'}) # 在大儿子中创建两个孙子
grandson2 = root.makeelement('grandson', {'name': '二孙子'})

son1.append(grandson1) # 将孙子添加到儿子节点中
son1.append(grandson2)

root.append(son1) # 把儿子添加到根节点中
root.append(son1)

tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)

# 方式三
root = ET.Element("famliy")

son1 = root.SubElement('son', {'name': '大儿子'}) # 创建大儿子节点
son2 = root.SubElement('son', {"name": '二儿子'}) # 创建二儿子节点

grandson1 = root.SubElement('grandson', {'name': '大孙子'}) # 在大儿子中创建两个孙子
grandson2 = root.SubElement('grandson', {'name': '二孙子'})

son1.append(grandson1) # 将孙子添加到儿子节点中
son1.append(grandson2)

root.append(son1) # 把儿子添加到根节点中
root.append(son1)

tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False) # short_empty_elements=False 表示控制元素的格式如果值为False,没有内容,它们是作为一个单独闭合的标签,否则它们会以一对的形式发射开始/结束标记

# 方式四 原生保存的XML时默认无缩进,如果想要设置缩进的话,需要修改保存方式
def prettify(elem):
    """将节点转换成字符串,并添加缩进。
    """
    rough_string = ET.tostring(elem, 'utf-8')
    reparsed = minidom.parseString(rough_string)
    return reparsed.toprettyxml(indent="\t")

root = ET.Element("famliy")

son1 = ET.Element('son', {'name': '大儿子'}) # 创建大儿子节点
son2 = ET.Element('son', {"name": '二儿子'}) # 创建二儿子节点

grandson1 = ET.Element('grandson', {'name': '大孙子'}) # 在大儿子中创建两个孙子
grandson2 = ET.Element('grandson', {'name': '二孙子'})

son1.append(grandson1) # 将孙子添加到儿子节点中
son1.append(grandson2)

root.append(son1) # 把儿子添加到根节点中
root.append(son1)

raw_str = prettify(root)

f = open("xxxo.xml",'w',encoding='utf-8')
f.write(raw_str)
f.close()

No.12 subprocess

执行系统命令模块

call 执行命令,返回状态码

check_call 执行命令,如果执行状态码是 0 ,则返回0,否则抛异常

check_output 执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常

subprocess.Popen(...) 用于执行复杂的系统命令

import subprocess
"""
终端输入的命令分为两种:
输入即可得到输出,如:ifconfig
输入进行某环境,依赖再输入,如:python
"""
# 执行普通命令
ret1 = subprocess.Popen(["mkdir","t1"])
ret2 = subprocess.Popen("mkdir t2", shell=True)

# 在指定目录上创建文件夹
obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)

# 依赖环境的命令
obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
obj.stdin.write("print(1)\n")
obj.stdin.write("print(2)")

out_error_list = obj.communicate()
print(out_error_list)

obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
out_error_list = obj.communicate('print("hello")')
print(out_error_list)
推荐阅读:
  1. Python全栈开发之Git
  2. Python全栈开发之Django进阶

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python 常用模块

上一篇:什么是Angular? 我们为什么要学习它?

下一篇:Zabbix部署、监测及邮件报警机制(实战!)

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》