首页 > 代码库 > 【python】-- json & pickle、xml、requests、hashlib、shelve、shutil、configparser、subprocess
【python】-- json & pickle、xml、requests、hashlib、shelve、shutil、configparser、subprocess
json & pickle
Python中用于序列化的两个模块
- json 用于【字符串】和 【python基本数据类型】 间进行转换
- pickle 用于【python特有的类型】 和 【python基本数据类型】间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
1、dumps序列化和loads反序列化
dumps()序列化 import json #导入json模块 info = { ‘name‘:"zhangqigao", "age":22 } with open("test.txt","w") as f: #以普通模式写入 data = http://www.mamicode.com/json.dumps(info) #把内存对象转为字符串 f.write(data) #写到文件中 #text.txt文件中的内容 {"name": "zhangqigao", "age": 22} ######################################### loads()反序列化 import json with open("test.txt","r") as f: #以普通模式读 data = http://www.mamicode.com/json.loads(f.read()) #用loads反序列化 print(data.get("age")) #输出 22
2、dump序列化和load反序列化
dump()序列化 import json info = { ‘name‘:"zhangqigao", "age":22 } with open("test.txt","w") as f: #文件以写的方式打开 json.dump(info,f) #第1个参数是内存的数据对象 ,第2个参数是文件句柄 #text.txt文件中的内容 {"name": "zhangqigao", "age": 22} ######################################### load()反序列化 import json with open("test.txt","r") as f: #以读的方式打开文件 data = http://www.mamicode.com/json.load(f) #输入文件对象 print(data.get("age")) #输出 22
小结:
- dumps和loads是成对使用的,dump和load是成对使用的。
- dumps和loads由于序列化的是内容,所以后面要加s,但是dump和load序列化的内容是对象,所以单数。
- json只能处理简单的数据类型,例如:字典、列表、字符串等,不能处理函数等复杂的数据类型。
- json是所有语言通用的,所有语言都支持json,如果我们需要python跟其他语言进行数据交互,那么就用json格式。
pickle模块提供了四个功能:dumps、dump、loads、load
1、dumps序列化和loads反序列化
dumps()序列化 import pickle info = { ‘name‘:"zhangqigao", "age":22, } with open("test.txt","wb") as f: #以二进制的形式写入 data = http://www.mamicode.com/pickle.dumps(info) #序列化成字符串 f.write(data) #写入test.txt 文件中 #输出到test.txt文件中的内容 ?}q (X ageqKX nameqX zhangqigaoqu. ######################################### loads()反序列化 import pickle with open("test.txt","rb") as f: #以二进制的模式读 data = http://www.mamicode.com/pickle.loads(f.read()) #反序列化操作 print(data.get("age")) #输出 22
2、dump序列化和load反序列化
dump()序列化 import pickle info = { ‘name‘:"zhangqigao", "age":22, } with open("test.txt","wb") as f: pickle.dump(info,f) #序列化 #输出 ?}q (X ageqKX nameqX zhangqigaoqu. ######################################### load()反序列化 import pickle with open("test.txt","rb") as f: data = pickle.load(f) #反序列化成内存对象 print(data.get("age")) #输出 22
小结:
- json值支持简单的数据类型,pickle支持所有的数据类型。
- pickle只能支持python本身的序列化和反序列化,不能用作和其他语言做数据交互,而json可以。
- pickle序列化的是字节,而json序列化的是字符
- pickle序列化的是整个的数据对象,所以反序列化函数时,函数体中的逻辑变了,是跟着心的函数体走的。
- pickle和json在3.0中只能dump一次和load一次,在2.7里面可以dump多次,load多次,以后只记住,只需要dump一次,load一次就可以了。
XML
XML是实现不同语言或者程序之间进行数据交换的协议,跟json差不多,但是json使用起来更简单,不过现在仍然有很多传统的公司,像金融行业的很多系统的接口还是XML
1、XML实例
<?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank updated="yes">2</rank> <year>2008</year> <gdppc>141100</gdppc> <neighbor name="Austria" direction="E"/> <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore"> <rank updated="yes">5</rank> <year>2011</year> <gdppc>59900</gdppc> <neighbor name="Malaysia" direction="N"/> </country> <country name="Panama"> <rank updated="yes">69</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country> </data>
2、查询xml文档内容
import xml.etree.ElementTree as et tree = et.parse("xmltest.xml") root = tree.getroot() #获取根节点 print(root.tag) #打印节点名称 #遍历xml文档 for child in root: print(child.tag,child.attrib) #分别打印子节点名称和子节点属性 #遍历子节点下的所有节点 for i in child: print(i.tag,i.text) #打印子节点下节点的节点名和节点值 #只遍历year节点 for i in child.iter("year"): print("\t",i.tag,i.attrib,i.text) #只遍历year节点 for node in root.iter("year"): print(node.tag,node.text) #打印year的节点名和节点值
注:
- tag是返回节点名,attrib返回节点属性,text返回节点值
- 返回根节点用getroot()方法
- 只遍历某个节点,只需要用iter(节点名)方法
3、修改xml文档内容
import xml.etree.ElementTree as et tree = et.parse("xmltest.xml") root = tree.getroot() #修改year节点的值 for node in root.iter("year"): new_year = int(node.text) + 1 #修改节点值 node.text = str(new_year) #修改后强制转换成字符串类型 node.tag = "myyear" #修改节点名 node.set("zhangqigao",‘handsome‘) #修改节点属性 tree.write("xmltest1.xml") #修改完成后,重新写入xml文件(可以是任何文件,包括原来的)
注:可以修改xml文件中的任何内容,包括本身的节点名,修改后一定要有写入xml文件的操作。
4、删除node节点
import xml.etree.ElementTree as et tree = et.parse("xmltest.xml") root = tree.getroot() #删除 for country in root.findall("country"): #找到第一层子节点 rank = int(country.find("rank").text) #找到子节点下的‘rank‘节点的节点值 if rank > 50: root.remove(country) #删除子节点 tree.write("xmltest1.xml") #重新写入xml文件
注:
- findall()从根节点只能根据第一层的子节点名查找,并且返回第一层子节点的内存地址
- find从根节点查找第一层子节点名,返回第一层子节点下的所有节点的内存地址
- 删除子节点用remove()方法
- 删除以后,一定要做重新写入新的xml文件操作
5、手动创建xml文件
import xml.etree.ElementTree as et new_xml = et.Element("namelist") #创建根节点 #创建第一层子节点,后面参数依次是:父节点,子节点,子节点属性 name = et.SubElement(new_xml,"name",attrib={"zhangqigao":"handsome"}) #创建第二层子节点 age = et.SubElement(name,"age",attrib={"check":"yes"}) #设置第二层节点值 age.text = ‘22‘ sex = et.SubElement(name,"sex") sex.text = "man" #创建另外一个第一层子节点 name2 = et.SubElement(new_xml,"name",attrib={"zhangqigao":"haoshuai"}) #创建其第二层子节点 age = et.SubElement(name2,"age") age.text = ‘19‘ ET = et.ElementTree(new_xml) #生成新的xml文档 ET.write("test.xml",encoding="utf-8",xml_declaration=True) #在新xml文件的开头自动添加:<?xml version=‘1.0‘ encoding=‘utf-8‘?> et.dump(new_xml) #在屏幕上打印生成的格式
注:et.dump(new_xml)这个有什么作用呢?当你需要直接把字符串传过去,不需要传文件时,用这个就ok了。
requests
Python标准库中提供了:urllib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。
发送get请求:
import urllib.request f = urllib.request.urlopen(‘http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508‘) result = f.read().decode(‘utf-8‘)
发送带有请求头的get请求:
import urllib.request req = urllib.request.Request(‘http://www.example.com/‘) req.add_header(‘Referer‘, ‘http://www.python.org/‘) r = urllib.request.urlopen(req) result = f.read().decode(‘utf-8‘)
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。
安装模块:
pip3 install requests
使用模块:
get请求:
# 1、无参数实例 import requests ret = requests.get(‘https://github.com/timeline.json‘) print(ret.url) print(ret.text) # 2、有参数实例 import requests payload = {‘key1‘: ‘value1‘, ‘key2‘: ‘value2‘} ret = requests.get("http://httpbin.org/get", params=payload) print(ret.url) print(ret.text)
post请求:
# 1、基本POST实例 import requests payload = {‘key1‘: ‘value1‘, ‘key2‘: ‘value2‘} ret = requests.post("http://httpbin.org/post", data=http://www.mamicode.com/payload) print(ret.text) # 2、发送请求头和数据实例 import requests import json url = ‘https://api.github.com/some/endpoint‘ payload = {‘some‘: ‘data‘} headers = {‘content-type‘: ‘application/json‘} ret = requests.post(url, data=http://www.mamicode.com/json.dumps(payload), headers=headers) print(ret.text) print(ret.cookies)
其他请求:
requests.get(url, params=None, **kwargs) requests.post(url, data=None, json=None, **kwargs) requests.put(url, data=None, **kwargs) requests.head(url, **kwargs) requests.delete(url, **kwargs) requests.patch(url, data=None, **kwargs) requests.options(url, **kwargs) # 以上方法均是在此方法的基础上构建 requests.request(method, url, **kwargs)
Http请求和XML实例:
实例:检测QQ账号是否在线
import urllib import requests from xml.etree import ElementTree as ET # 使用内置模块urllib发送HTTP请求,或者XML格式内容 """ f = urllib.request.urlopen(‘http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508‘) result = f.read().decode(‘utf-8‘) """ # 使用第三方模块requests发送HTTP请求,或者XML格式内容 r = requests.get(‘http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508‘) result = r.text # 解析XML格式内容 node = ET.XML(result) # 获取内容 if node.text == "Y": print("在线") else: print("离线")
实例:查看火车停靠信息
import urllib import requests from xml.etree import ElementTree as ET # 使用内置模块urllib发送HTTP请求,或者XML格式内容 """ f = urllib.request.urlopen(‘http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=‘) result = f.read().decode(‘utf-8‘) """ # 使用第三方模块requests发送HTTP请求,或者XML格式内容 r = requests.get(‘http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=‘) result = r.text # 解析XML格式内容 root = ET.XML(result) for node in root.iter(‘TrainDetailInfo‘): print(node.find(‘TrainStation‘).text,node.find(‘StartTime‘).text,node.tag,node.attrib)
hashlib
写程序中,经常需要对字符串进行MD5加密,python中也支持这种加密
1、MD5加密
原则:只要你的输入是固定的,你的输出也一定是固定的。MD5是在hash上更改的,主要做文件的一致性
import hashlib m = hashlib.md5() #创建一个MD5对象 m.update(b"zhang") #在python3中需要是2进制的值,所以字符串前加b print(m.hexdigest()) #以16进制打印MD5值 #输出 d0cd2693b3506677e4c55e91d6365bff m.update(b"qigao") print(m.hexdigest()) #输出 0bfca190ecc60e44cbc739ca9c252133
文件MD5加密:
说明:如果我们想得到一个文件所有内容的MD5值,我们所做的方法是循环这个文件,获取每行的MD5值,但是这样生成的MD5值的效率会变慢,因为每一行都需要计算。这样我们还不如直接把文件的所有内容加载出来,直接计算它的MD5值,这样反而快些。
import hashlib m = hashlib.md5() #创建MD5对象m m.update(b"zhang") print(m.hexdigest()) #输出 d0cd2693b3506677e4c55e91d6365bff m.update(b"qigao") print(m.hexdigest()) #输出 0bfca190ecc60e44cbc739ca9c252133 m2 = hashlib.md5() #创建MD5对象m2 m2.update(b"zhangqigao") print(m2.hexdigest()) #输出 0bfca190ecc60e44cbc739ca9c252133
注:由上面的代码可以看出,你读到最后一行的字符串的MD5值跟一下子读取所有内容的MD5值是一样的,这是为什么呢?其实这边update做了一个拼接功能,m.update(b"zhang")是返回的字符串"zhang"的MD5值,但是到了第二个m.update("qigao")的值并不是"qigao"的字符串的MD5值,它需要拼接前面的字符串,应该是m.update(b"zhangqigao")的MD5值,所以相当于m.update(b"zhang"),m.update(b"qigao") = m.update(b"zhang"+b"qigao")。
2、sha1加密
import hashlib hash = hashlib.sha1() hash.update(b"zhangqigao") print(hash.hexdigest()) #输出 c8b2a6571067f92133b5b43a085f1ddd36e8c3fb
3、sha256加密
说明:sha256用的比较多,相比MD5要更加的安全
import hashlib hash = hashlib.sha256() hash.update(b"zhangqigao") print(hash.hexdigest()) #输出 0634de5fe3d009fd0ec76ab3d97ab0fe37969b696e8d6550797cf3b446dd78ba
4、sha384加密
import hashlib hash = hashlib.sha384() hash.update(b"zhangqigao") print(hash.hexdigest()) #输出 3489c64e31671094ca1afde35fd31ee9b09cdb90c3728f31696829e8a56be311e1405d537179e62d236e6d70a4f13ff4
5、sha512加密
import hashlib hash = hashlib.sha512() hash.update(b"zhangqigao") print(hash.hexdigest()) #输出 cb09fd5a519b2b075f4aa5965a39657df900fff832b73d161a426512b6023ab8c1c0872a7b2d50055cbd75c4b6f374cda0615be9530f7f4b7dc08ab3f266325d
注意:
- 以上这几种,其实都是对MD5加密的不同算法
- 其中sha256用的最多,比MD5要安全的多
- 有些公司会用加密方式加密,比如:把字符串"zhangqigao",通过一定的算法变成"zhang.qi.gao",当然这种算法自己肯定要知道,然后MD5加密,当然每个公司的加密方式是不一样的。
6、hmac加密
其实以上还不是最牛的,最牛的是下面这种,叫hmac加密,它内部是对我们创建key和内容进行处理再进行加密。
散列消息鉴别码,简称HMAC,是一种基于消息鉴别码MAC(Message Authentication Code)的鉴别机制。使用HMAC时,消息通讯的双方,通过验证消息中加入的鉴别密钥K来鉴别消息的真伪;
一般用于网络通信中消息加密,前提是双方先要约定好key,就像接头暗号一样,然后消息发送把用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值 跟 发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。
import hmac #导入hmac模块 hash = hmac.new(b"zhang",b"qigao") #zhang是key,qigao是内容 print(hash.hexdigest()) #输出 2f124c86aeb5142246198f77a142e855
更多加密:点击
【python】-- json & pickle、xml、requests、hashlib、shelve、shutil、configparser、subprocess