Python开发Day06
模块补充
-
hashlib
-
介绍
- 本模块用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
-
使用
-
md5
import hashlib hash = hashlib.md5() hash.update(bytes('Qi', encoding='utf-8')) print(hash.hexdigest())
-
sha1
hash = hashlib.sha1() hash.update(bytes('Wu',encoding='utf-8')) print(hash.hexdigest())
-
sha256
hash = hashlib.sha256() hash.update(bytes('Wu', encoding='utf-8')) print(hash.hexdigest())
-
sha384
hash = hashlib.sha384() hash.update(bytes('Wu', encoding='utf-8')) print(hash.hexdigest())
-
sha512
hash = hashlib.sha512() hash.update(bytes('Wu', encoding='utf-8')) print(hash.hexdigest())
-
-
ps:以上的价目算法虽然很厉害,但是存在缺陷,可以通过装库来反解,所以在有必要的时候对加密算法中添加自定义key后再来做加密
- MD5
import hashlib hash = hashlib.md5(bytes('89fds',encoding="utf-8")) hash.update(bytes('Wu',encoding="utf-8")) print(hash.hexdigest())
- MD5
- python还有一个内置的hmac模块,他内部对我们创建的key和内容进行额外的处理然后加密
import hmac h = haac.new(bytes('sasss',encoding='utf-8)) h.update(bytes('Qi',encoding='utf-8')) print(h.hexdigest())
-
-
configparser
-
介绍
- 用来处理特定格式的文件,本质上是利用open来操作文件
-
使用
-
获取所有的节点
import configparser config = configparser.ConfigParser() config.read('test', encoding='utf-8')#参数一:要打开文件的路径。参数二:指定打开文件时使用什么编码 ret = config.sections()#获取所有的节点,用列表返回 print(ret)
-
获取指定节点下所有的键值对
import configparser config = configparser.ConfigParser() config.read('test', encoding='utf-8') ret = config.items('k1') print(ret)
-
获取指定节点下所有的建
import configparser config = configparser.ConfigParser() config.read('test', encoding='utf-8') ret = config.options('W') print(ret)
-
获取指定节点下指定key的值
import configparser config = configparser.ConfigParser() config.read('test', encoding='utf-8') ret = config.get('w','k1')#获取w节点下的k1的值 ret2 = config.getint('section1', 'k1')#获取w节点下的k1的值,并转成整型 ret3 = config.getfloat('section1', 'k1')#获取w节点下的k1的值,并转成浮点型 ret4 = config.getboolean('section1', 'k1')#获取w节点下的k1的值,并转成bool型 print(ret)
-
添加节点
import configparser config = configparser.ConfigParser() config.read('test', encoding='utf-8') config.add_section("WU")#添加一个WU节点 config.write(open('test', 'w'))#将内存中修改后的内容写入到文件中
-
检查节点
import configparser config = configparser.ConfigParser() config.read('test', encoding='utf-8') has_sec = config.has_section('W3')#检查节点W3是否存在存在返回True否则False print(has_sec)
-
删除节点
import configparser config = configparser.ConfigParser() config.read('test', encoding='utf-8') config.remove_section("WU")#删除WU节点 config.write(open('test', 'w'))
-
删除节点内某一个键的值
import configparser config = configparser.ConfigParser() config.read('test',encoding='utf-8') config.remove_option('W1','name')#在内存中删除W1节点下的name键值对 config.write(open('test','w'))#将内存中的内容写入文件
-
检查某一个节点中有没有这个键
import configparser config = configparser.ConfigParser() config.read('test',encoding='utf-8') print(config.has_option('W1','name'))
-
设置指定节点中指定键的值
import configparser config = configparser.ConfigParser() config.read('test', encoding='utf-8') config.set('W1','name','WuYongQi')#将W1节点下的键为name的值改成WuYongQi config.write(open('test','w'))#将内存中的内容写入的磁盘
-
-
-
XML
-
介绍
- XML是实现不同语言或程序之间进行数据交换的协议,具体格式如下
<data> <country name="Liechtenstein"> <rank updated="yes">2</rank> <year>2023</year> <gdppc>141100</gdppc> <neighbor direction="E" name="Austria" /> <neighbor direction="W" name="Switzerland" /> </country> <country name="Singapore"> <rank updated="yes">5</rank> <year>2026</year> <gdppc>59900</gdppc> <neighbor direction="N" name="Malaysia" /> </country> <country name="Panama"> <rank updated="yes">69</rank> <year>2026</year> <gdppc>13600</gdppc> <neighbor direction="W" name="Costa Rica" /> <neighbor direction="E" name="Colombia" /> </country> </data>
- XML是实现不同语言或程序之间进行数据交换的协议,具体格式如下
-
使用方法
-
解析XML的两种方法
-
使用 ElementTree.XML
from xml.etree import ElementTree as ET str_xml = open('test.xml', 'r').read()#打开文件,读取xml文件内容 root = ET.XML(str_xml)#将字符串解析成xml特殊对象,root代指xml文件的根节点
-
使用ElementTree.parse
from xml.etree import ElementTree as ET tree = ET.parse("xo.xml")#直接解析xml文件 root = tree.getroot()#获取xml文件的根节点
-
-
操作XML文件
-
Element类的方法
- tag 当前节点标签名
- attrib 当前节点属性
- text 当前节点的内容
- makeelement(tag,attrib) 创建一个新的节点
- append(self, subelement) 在当前节点追加一个子元素
- extend(self, elements) 为当前节点扩展 n 个子节点,elements是一个序列
- insert(self, index, subelement) 在当前节点创建子节点,然后插入指定位置
- remove(self, subelement) 删除指定的节点subelement
- find(self, path, namespaces=None) 获取第一个寻找到的子节点
- findtext(self,path,default=None,namespaces=None)获取第一个寻找到的子节点内容
- findall(self, path, namespaces=None) 获取所有的子节点
- iterfind(self, path, namespaces=None) 获取所有指定的节点,并创建一个迭代器(可以被for循环)
- clear(self) 清空节点
- get(self, key, default=None) 获取当前节点的属性值
- set(self, key, value) 为当前节点设置属性值
- keys(self) 获取当前节点所有属性的key
- items(self) 获取当前节点所有的属性值,每一个属性都是一对键值对
- iter(self, tag=None) 在当前节点的子孙中根据节点名称寻找所有指定的节点,并返回一个迭代器(可以被for循环)。
- itertext(self) 在当前节点下所有的节点中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器(可以被for循环)。
-
浏览XML文档中所有内容
from xml.etree import ElementTree as ET #使用xml文件夹下的etree文件夹下的EementTree文件,并且自定义名称为ET -------------- 打开方式一 -------------- str_xml = open('test.xml', 'r').read()# 打开文件,读取XML文件内容 root = ET.XML(str_xml)#将字符串解析成xml特殊对象,root代指xml文件的根节点 -------------- 打开方式二 -------------- tree = ET.parse("xo.xml")#直接解析xml文件 root = tree.getroot()#获取xml文件的根节点 print(root.tag)# 查看root节点名称 for i in root:#查询XML文档的第二层 print(i.tag, i.attrib)查看第二层节点的标签名称和标签属性 for ii in i: #查询XML文档的第三层 print(ii.tag,ii.text) #查看第三层节点的标签名称和内容
-
浏览XML文档中指定的节点
from xml.etree import ElementTree as ET tree = ET.parse("xo.xml") root = tree.getroot() print(root.tag) for i in root.iter('year'):# 查询XML中所有的year节点 print(i.tag, i.text)#输出节点的标签名称和内容
-
修改节点内容(方法一)
from xml.etree import ElementTree as ET str_xml = open('xo.xml', 'r').read() root = ET.XML(str_xml) for i in root.iter('year'): #循环所有的year节点 new_year = int(i.text) + 10 #将year节点中的内容 增加十 i.text = str(new_year) i.set('name', 'Wu') #设置属性本次循环节点的属性name为Wu i.set('age', '20') #设置属性本次循环节点的属性age为20 del i.attrib['name'] #删除本次循环节点属性name tree = ET.ElementTree(root) #使用ElementTree下的ElementTree方法 tree.write("test2.xml", encoding='utf-8')#写如文件test2.xml中,使用utf-8编码
-
修改节点内容(方法二)
from xml.etree import ElementTree as ET tree = ET.parse("xo.xml") root = tree.getroot() for i in root.iter('year'): #循环所有的year节点 new_year = int( i.text) + 10 # 将year节点中的内容增加十给变量new_year i.text = str(new_year) #当前循环的节点内容修改为变量new_year i.set('name', 'WU') #设置本次循环节点属性name为WU i.set('age', '25') #设置本次循环节点属性age为25 del i.attrib['age'] # 删除本次循环节点属性age tree.write("test3.xml", encoding='utf-8') #上面修改的是内存里的内容所以需要我们去写去到文件中,test3.xml为保存的文件名,写入时使用utf-8编码类型
-
创建XML文档(方法一)
from xml.etree import ElementTree as ET root = ET.Element("hello")# 创建根节点 # 在根节点下创建第一个节点为son1,并且创建属性name值为hello a1 = ET.Element('son', {'name': 'hello'}) # 在根节点下创建第二个节点为son2,并且创建属性name值为word s1 = ET.Element('son2', {"name": 'word'}) root.append(a1) #向跟节点下创建son1 root.append(s1) #向根节点下创建son2 # 在根节点下的第一个节点中继续创建节点,属性name值为Wu a2 = ET.Element('aaaaaa2', {'name': 'Wu'}) # 在根节点下的第一个节点中继续创建节点,属性name值为Qi a3 = ET.Element('aaaaaa3', {'name': 'Qi'}) a1.append(a2) #向son节点下创建aaaaaa2 a1.append(a3) #向son节点下创建aaaaaa3 tree = ET.ElementTree(root) tree.write('test4.xml',encoding='utf-8', short_empty_elements=True)#将内容写入文件test4.xml中使用utf-8编码,如果节点中没有text内容那么就自闭合
-
创建XML文档(方法二)
from xml.etree import ElementTree as ET # 创建根节点 root = ET.Element("famliy") # 在根节点下创建第一个节点为son1,并且创建属性name值为hello a1 = ET.Element('son', {'name': 'hello'}) # 在根节点下创建第二个节点为son2,并且创建属性name值为word s1 = ET.Element('son2', {"name": 'word'}) root.append(a1) #向跟节点下创建son1 root.append(s1) #向根节点下创建son2 # 在根节点下的第一个节点中继续创建节点age,属性name值为Wu a2 = ET.SubElement(a1, "age", attrib={'name': 'Wu'}) a2.text = 'hello' #向节点No中添加text内容为hello a1.append(a2) #向son节点下创建age tree = ET.ElementTree(root) tree.write('test4.xml',encoding='utf-8',xml_declaration=True,short_empty_elements=True)#将内容写入文件test4.xml中使用utf-8编码,如果节点中没有text内容那么久自闭合,并且声明xml
-
如果创建的xml需要自动换行看上去更美观一些使用xml下的dom下的minidom模块
from xml.etree import ElementTree as ET from xml.dom import minidom def prettify(elem): #创建函数来处理内容,将节点转换成字符串,并添加缩进 a = ET.tostring(elem, 'utf-8') b = minidom.parseString(a) return b.toprettyxml(indent="\t") # 创建根节点 root = ET.Element("famliy") # 在根节点下创建第一个节点为son1,并且创建属性name值为hello a1 = ET.Element('son', {'name': 'hello'}) # 在根节点下创建第二个节点为son2,并且创建属性name值为word s1 = ET.Element('son2', {"name": 'word'}) root.append(a1) #向跟节点下创建son1 root.append(s1) #向根节点下创建son2 # 在根节点下的第一个节点中继续创建节点名为age,属性name值为Wu a2 = ET.SubElement(a1, "age", attrib={'name': 'Wu'}) a2.text = 'a1节点下的的一个节点' a1.append(a2) #向a1节点下创建a2 aaa = prettify(root)#执行这个函数并把节点传进去 f = open("test4.xml",'w',encoding='utf-8')#使用open方法写入并保存退出 f.write(aaa) f.close()
-
命名空间
- 命名空间是提供避免元素名冲突的方法
-
使用前缀来避免命名冲突
<h:table> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table>
-
定义命名空间
<h:table xmlns:h="http://www.w3.org/TR/html4/">#定义命名空间h='' <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table>
-
-
-
-
requests
-
介绍
- Python的标准库中提供了urllib等模块来提供http请求,但是他用有些不太好用。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。
-
使用
-
使用urllib模块发送get请求
import urllib.request a = urllib.request.urlopen('http://www.baidu.com') result = f.read().decode('utf-8')
-
发送携带请求头的get请求
import urllib.request req = urllib.request.Request('http://www.baidu.com/') req.add_header('Referer', 'http://www.python.org/') r = urllib.request.urlopen(req) result = f.read().decode('utf-8')
-
安装模块requests
pip3 install requests
-
使用requests模块get请求
######无参数实例###### import requests ret = requests.get('https://github.com/timeline.json') print(ret.url) print(ret.text) #####有参数实例###### import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.get("http://httpbin.org/get", params=payload) print(ret.url) print(ret.text)
-
使用requests模块post请求
#####基本的post##### import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.post("http://httpbin.org/post", data=payload) print(ret.text) #####发送请求头和数据#### import requests import json url = 'https://api.github.com/some/endpoint' payload = {'some': 'data'} headers = {'content-type': 'application/json'} ret = requests.post(url, data=json.dumps(payload), headers=headers) print(ret.text) print(ret.cookies)
-
使用http请求和XML来做一个检查QQ是否在线
import requests from xml.etree import ElementTree as ET r=requests.get('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')# 使用第三方模块requests发送HTTP请求,或者XML格式内容 result = r.text#获取内容 node = ET.XML(result)# 解析XML内容 if node.text == "Y":# 获取内容到XML的text的内容判断是不是等于Y print("在线")#等于的话就是在线 else:#不等于 print("离线")#不等于就是不在线
-
使用http请求和XML来做一个列车时刻表
import requests#导入模块requests a = requests.get("http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=D2003&UserID=")#使用模块requests发起get请求 b = a.text#将get获取的请求赋值给变量b import xml.etree.ElementTree as ET#导入xml模块 node =ET.XML(b)解析XML文件内容 for i in node.iter('TrainDetailInfo'):#循环输出XML文件中TrainDetailInfo节点 print('到达站:%s\t 到达时间:%s\t 发车时间:%s '%(i.find('TrainStation').text,i.find('ArriveTime').text,i.find('StartTime').text))自定义输出
-
-
-
logging
-
介绍
- 用于便捷记录日志且线程安全的模块
-
使用
-
单文件日志
import logging logging.basicConfig(filename='log.log', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', level=10) logging.debug('debug') logging.info('info') logging.warning('warning') logging.error('error') logging.critical('critical') logging.log(10,'log')
-
多文件日志
# 定义文件 file_1_1 = logging.FileHandler('l1_1.log', 'a') #文件1 fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s") file_1_1.setFormatter(fmt) file_1_2 = logging.FileHandler('l1_2.log', 'a') #文件2 fmt = logging.Formatter() file_1_2.setFormatter(fmt) # 定义日志 logger1 = logging.Logger('s1', level=logging.ERROR)#s1使用ERROE的数值判断 logger1.addHandler(file_1_1)#写入文件1 logger1.addHandler(file_1_2)#写入文件2 # 写日志 logger1.critical('1111')
-
-
-
系统命令
-
介绍
- 用于执行系统命令
-
使用
import subprocess a = subprocess.check_output('ipconfig')#执行系统命令,如果需要返回码可以将结果赋给一个变量。 print(str(a,encoding='gbk'))#输出系统命令执行结果
-
-
shutil
-
介绍
- 用于高级的 文件、文件夹、压缩包 处理模块
-
使用
-
将文件内容拷贝到另一个文件中
import shutil shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w')) #将old.xml的内容拷贝到new.xml文件中
-
拷贝文件
import shutil shutil.copyfile('f1.log', 'f2.log')#将f1.log复制一份命名为f2.log
-
仅拷贝权限。内容、组、用户均不变
import shutil shutil.copymode('f1.log', 'f2.log')#将f1.log只拷贝他的权限赋值一份命名为f2.log
-
拷贝状态的信息,包括:mode bits, atime, mtime, flags
import shutil shutil.copystat('f1.log', 'f2.log')#拷贝状态的信息,包括:mode bits, atime, mtime, flags
-
拷贝文件和权限
import shutil shutil.copy('f1.log', 'f2.log')
-
拷贝文件和状态信息
import shutil shutil.copy2('f1.log', 'f2.log')
-
递归的去拷贝文件夹
import shutil shutil.copytree('文件夹1', '文件夹2',ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
-
递归的去删除文件
import shutil shutil.rmtree('folder1')
-
递归的去移动文件,类似mv命令,重命名。
import shutil shutil.move('folder1', 'folder3')#将folder1名称改成folder3
-
解压(默认使用的是zipfile和tarfile模块)
base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径, 如:www =>保存至当前路径 如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/ format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar” root_dir: 要压缩的文件夹路径(默认当前目录) owner: 用户,默认当前用户 group: 组,默认当前组 logger: 用于记录日志,通常是logging.Logger对象
#将 /Users/wupeiqi/Downloads/test 下的文件打包放置当前程序目录 import shutil ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test') #将 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目录 import shutil ret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')
-
-
-
tarfile和zipfile
-
介绍
- 用于压缩包 处理模块
-
使用
-
解压或压缩zip模式
import zipfile#解压压缩模块 #压缩成ZIP z = zipfile.ZipFile('laxi.zip', 'w') z.write('a.log') z.write('data.data') z.close() #解压ZIP格式 z = zipfile.ZipFile('laxi.zip', 'r') z.extractall() z.close()
-
解压或压缩tar模式
import tarfile # 压缩 tar = tarfile.open('your.tar','w') tar.add('/Users/wupeiqi/PycharmProjects/bbs2.log', arcname='bbs2.log') tar.add('/Users/wupeiqi/PycharmProjects/cmdb.log', arcname='cmdb.log') tar.close() # 解压 tar = tarfile.open('your.tar','r') tar.extractall() #可设置解压地址 tar.close()
-
-