一: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'))