python常用模块--xml,re,suprocess,hashlib,configparser

时间:2022-05-05 22:38:19

一:xml模块

XML:可扩展标记语言(eXtensible Markup Language),是一种用于标记电子文件使其具有结构性的标记语言
XML 被设计用来传输和存储数据.
import xml.etree.ElementTree as ET
tree = ET.parse('c.xml')
root = tree.getroot()

# 查找
res = root.iter('year')    #会在整棵树上进行查找,把所有的year元素找到,产生一个迭代器
# print(next(res))
for item in res:
    print(item)           #<Element 'year' at 0x0000024A92C9BC78>
    print(item.tag)       #元素的标签   year
    print(item.attrib)    #元素的属性   {'updated': 'yes'}
    print(item.text)      #元素的文本    2018
    print('*'*30)

res1 = root.find('country')     #只能从子节点中查找,只要找到一个就结束查找
res2 = root.find('year')     #无法找到,返回None
print(res1.tag)               #country
print(res1.attrib)            #{'name': 'Liechtenstein'}
print(res1.text)              #该元素标签内无文本

res3 = root.findall('country')   #只能从子节点中查找,查找出所有的该元素,返回一个列表
res4 = root.findall('year')      #无法找到,返回一个空列表
print(res3,res4)
print(res3[0].attrib)          #{'name': 'Liechtenstein'}
# 改
for year in root.iter('year'):
    year.text = str(int(year.text) - 10)
    # year.attrib = None
    year.attrib = {'update':'yes'}
tree.write('a.xml')

# 增、删
for country in root.iter('country'):
    year = country.find('year')
    month = country.find('month')
    if int(year.text) < 2000:
        ele = ET.Element('month')     # 创建标签元素
        ele.attrib = {'number':'3'}   # 为新元素增加一个属性
        ele.text = 'march'
        # country.append(ele)        # 将新元素加入country
        country.remove(month)        # 将元素 month 删除
tree.write('c.xml')

二:re模块,即正则表达式

    正则表达式,又称规则表达式,是一种文本模式,通常用来检索、替换和控制文本。正则表达式是对字符串操作的一种逻辑公式。

    1,正则表达式元字符:

匹配单个字符
点号 匹配单个任意字符

[...]  字符组

匹配单个列出的字符
[^...]  排除型字符组 匹配单个未列出的字符
\char  转义字符

 匹配char对应的普通字符

注意点:[0-9]  匹配所有数字,其中的连字符 - 表示一个范围,[a-z] 匹配小写字母 [A-Z] 匹配大写字母;如果符号 - 在字符组内的两边,则只表示该符号本身,不再具有表示一个范围的特殊含义了,[-az] 匹配 - 或 a 或 z 中的一个。符号 ^ 在字符组[]内开头,表取非的意义,即成了一个排除型字符组;如果符号 ^ 不在字符组的开头,而在其他位置,则只表示其自身

提供计数功能元字符
? 问号  匹配一次或零次(单次可选)
*  星号  匹配任意次数
+  加号  至少匹配一次
{min,max}  区间量词{n};{n,}  至少min次,至多max次(python贪婪匹配);前面的一个字符或字符组匹配n次;至少n次
匹配位置元字符
^  脱字符  匹配一行的开头位置
$  美元符  匹配一行的结束位置
(\< ,  \> ) 单词分界符 python中使用 \b  字母数字符号的开始和结束
其他元字符
|  多选结构  或;匹配任意分隔的表达式
()  括号  限定多选结构的范围;分组;捕获文本
(?: ) 非捕获型括号  限定多选结构的范围;分组
\1 , \2 ,...反向引用

 匹配之前第一,第二组括号内表达式匹配的文本

    其他字符匹配模式:

其他字符匹配模式
\w   匹配大小写字母,数字及下划线
\W  匹配非字母数字下划线,即除了\w能匹配的
\s  匹配任意空白字符  包括空格符   [\n\r\t\f]
\S  匹配任意非空白字符
\d  匹配任意数字  等价于 [0-9]
\D  匹配任意非数字
\n ,\t   匹配一个换行符;一个制表符
\A  只匹配整个字符串的开头, 即使在M模式下,它也不会匹配其他各行的行首
\Z  只匹配整个字符串的结尾,即使在M模式下,它也不会匹配其他各行的结尾
\b  匹配单词边界,比如空格等,不过它是一个0长度字符
\B  匹配非边界,与\b相反,同样是一个0长度字符
import re
print(re.findall('.*hi','rock hi,mike hi,kita hi'))   # 贪婪匹配 ['rock hi,mike hi,kita hi']
print(re.findall('.*?hi','rock hi,mike hi,kita hi'))   # 非贪婪匹配 ['rock hi', ',mike hi', ',kita hi']
# 非贪婪匹配(最小匹配):.*?  *?  +?  ??
print(re.findall('^\d+','66ddd\n12d3\n3%& ',re.M))   # ['66', '12', '3']
print(re.findall('\A\d+','66ddd\n12d3\n3%&',re.M))   # ['66']

# 正则表达式前面推荐加个r,以防表达式在传给re模块处理前被python先转义了。
print(re.findall(r'\brock\b','trock rock rocki trocki'))   # 只能匹配到rock
print(re.findall('\Brock\B','trock rock rocki trocki'))   # 匹配到不以r开头,不以k结尾的trocki

   2,python中re模块的方法:

#查找re模块所有方法
print(dir(re))
# 查看某个方法的使用
help(re.match)

    re选项:

A     ASCII 使\w\W\b\B\d\D匹配ASCII字符
I      IGNORECASE 忽略大小写
L     LOCALE 使\w\W\b\B匹配本地字符集
M    MULTILINE 多行模式,"^" 匹配每行开头,"$"匹配每行结尾
S     DOTALL "." 匹配所有字符,包括"\n"
X     VERBOSE 详细模式,忽略空白可以加入注释
U     UNICODE 使\w\W\b\B\d\D匹配unicode字符集
import re
# re.findall(pattern,string,flags=0)    # 从头开始匹配,以一个列表的形式返回所有匹配成功的子字符串
# match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None。
print(re.match('rock','hi,rock,howareyou'))  # None
print(re.match('rock','rock,hi,howareyou'))  # <_sre.SRE_Match object; span=(0, 4), match='rock'>
print(re.match('rock','rock,hi,howareyou').group())  #rock

# search会在字符串中进行匹配,直到找到第一个匹配,然后返回一个对象
print(re.search('rock','hi,rock,howareyou,rock'))  # <_sre.SRE_Match object; span=(3, 7), match='rock'>
print(re.search('rock','rock,hi,howareyou'))  # <_sre.SRE_Match object; span=(0, 4), match='rock'>
print(re.search('rock','rock,hi,howareyou').group())  #rock

# compile 可以把正则表达式编译成一个正则对象;可把经常要使用的正则表达式预编译,提高效率
k = re.compile('\w*o\w*')
print(k)
print(k.findall('hello rock,how are you'))  #['hello', 'rock', 'how', 'you']

# re.split(pattern, string, maxsplit=0, flags=0) 用于切割字符串
print(re.split('\s+','hello rock i love you'))   # ['hello', 'rock', 'i', 'love', 'you']


# re.sub(pattern, repl, string, count=0, flags=0)  用于替换字符串的匹配项;返回替换后的字符串
print(re.sub(r'\bruck\b','rock','hello,ruck ruck.rucky'))  #hello,rock rock.rucky

三:suprocess模块

window系统dos命令
tasklist | findstr python     从所有进程中刷选出python进程并打印到终端
taskkill   结束进程

linux系统
ps aux | grep python
kill
import subprocess

obj = subprocess.Popen(
    'dir',        # cmd指令
    shell=True,   # 调用命令解释器
    stdout=subprocess.PIPE,  # 将正确的输出放入一个管道,按系统默认的字符编码编码
    stderr=subprocess.PIPE   # 将错误的输出放入一个管道
)

res1 = obj.stdout.read()     # 将管道中的内容读出来
res2 = obj.stderr.read()
print('Right:',res1.decode('gbk'))     # 需要使用系统默认的字符编码进行解码
print('Wrong:',res2.decode('gbk'))

四:hashlib模块

    hash是一种算法,叫哈希算法,也称为摘要算法:它通过一个函数,把任意长度的数据转换为一个长度固定的数据串,即hash值(通常用16进制的字符串表示)

hash值的特点是:
1,只要传入的内容一样,得到的hash值必然一样 ======》数据的完整性验证
2,不能由hash值反解出内容 
3,只要使用的hash算法不变,无论传入的内容有多大,得到的hash值长度是固定的
import hashlib

m=hashlib.md5()
m.update('hello'.encode('utf-8'))
m.update('world'.encode('utf-8'))
print(m.hexdigest())   #fc5e038d38a57032085441e7fe7010b0
# 密码加盐
import hashlib
pwd='rock123'

m=hashlib.md5()
m.update('add salt'.encode('utf-8'))   # 在密码前后各加点内容
m.update(pwd.encode('utf-8'))
m.update('add salt again'.encode('utf-8'))
print(m.hexdigest()) 

五:configparser模块

    configparser模块用于对配置文件的增删查改。

#my.ini文件内的内容
'''
[rock]
age=18
pwd=123
sex=male
salary=25.1
is_beautifull=True

[kita]
age=20
pwd=456
sex=female
salary=15.5
is_beautifull=False
'''
import configparser

config=configparser.ConfigParser()
config.read('my.ini')

print(config.sections())    # ['rock', 'kita']
print(config.options('rock'))   # ['age', 'pwd', 'sex', 'salary', 'is_beautifull']

age1 = config.get('rock','age')    # 18 <class 'str'>
age2= config.getint('rock','age')  # 18 <class 'int'>
salary = config.getfloat('rock','salary')  # 25.1 <class 'float'>
b=config.getboolean('rock','is_beautifull')   # True <class 'bool'>

#删除整个标题
config.remove_section('section')
#删除标题section1下的某个k1
config.remove_option('section1','k1')
#判断是否存在某个标题
config.has_section('section')
#判断标题section下是否有age
print(config.has_option('section','age'))

#添加一个标题
config.add_section('mike')
config.set('mike','name','mike')
config.set('mike','age','28')
#最后将修改的内容写入文件,完成最终的修改
config.write(open('a.cfg','w'))