【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 = json.dumps(info) #把内存对象转为字符串
    f.write(data)   #写到文件中

#text.txt文件中的内容
{"name": "zhangqigao", "age": 22}

#########################################
loads()反序列化

import json

with open("test.txt","r") as f:  #以普通模式读
    data = 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 = json.load(f)  #输入文件对象

print(data.get("age"))

#输出
22

小结:

  1. dumps和loads是成对使用的,dump和load是成对使用的。
  2. dumps和loads由于序列化的是内容,所以后面要加s,但是dump和load序列化的内容是对象,所以单数。
  3. json只能处理简单的数据类型,例如:字典、列表、字符串等,不能处理函数等复杂的数据类型。
  4. 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 = 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 = 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

小结:

  1. json值支持简单的数据类型,pickle支持所有的数据类型。
  2. pickle只能支持python本身的序列化和反序列化,不能用作和其他语言做数据交互,而json可以。
  3. pickle序列化的是字节,而json序列化的是字符
  4. pickle序列化的是整个的数据对象,所以反序列化函数时,函数体中的逻辑变了,是跟着心的函数体走的。
  5. 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的节点名和节点值

注:

  1. tag是返回节点名,attrib返回节点属性,text返回节点值
  2. 返回根节点用getroot()方法
  3. 只遍历某个节点,只需要用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文件

注:

  1. findall()从根节点只能根据第一层的子节点名查找,并且返回第一层子节点的内存地址
  2. find从根节点查找第一层子节点名,返回第一层子节点下的所有节点的内存地址
  3. 删除子节点用remove()方法
  4. 删除以后,一定要做重新写入新的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=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=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

注意:

  1. 以上这几种,其实都是对MD5加密的不同算法
  2. 其中sha256用的最多,比MD5要安全的多
  3. 有些公司会用加密方式加密,比如:把字符串"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

更多加密:点击

时间: 2024-08-09 06:35:32

【python】-- json & pickle、xml、requests、hashlib、shelve、shutil、configparser、subprocess的相关文章

【python】json中字典key不可为数值型

遇到了一个很诡异的错误.写一个字典,存入json文件.之后读出判断是否存在key.结果惊奇的发现,同一个key居然存在两次. 原因:json会将数值key转换为unicode 结论:使用json时字典key不可为数值! 复现问题: >>> a = {} >>> a[1] = 1 >>> b = json.dumps(a) >>> c = json.loads(b) >>> a {1: 1} >>>

【Python】定位一组元素、

前几天生病加懒惰 TAT ========================================================================== 1.getAttribute()方法是一个函数.它只有一个参数--你打算查询的属性的名字: 2.http://www.cnblogs.com/fnng/p/3190966.html 注意路径 3. [Python]定位一组元素.,布布扣,bubuko.com

【Python】Windows平台下Python、Pydev连接Mysql数据库

Mysql数据库是跨平台的,不是说Python一定就要连接Mongodb. Python连接Mysql数据库是很简单的. 首先,你要配置好Python的开发环境,详见<[Python]Windows版本的Python开发环境的配置,Helloworld,Python中文问题,输入输出.条件.循环.数组.类>(点击打开链接),与Mysql的开发环境,详见<[Mysql]Mysql的安装.部署与图形化>(点击打开链接). 之后,打开Python的官网(点击打开链接),如下图,直接下载一

【python】glob模块、os模块

http://www.cnblogs.com/hongten/p/hongten_python_glob.html http://wenku.baidu.com/link?url=AgUq9_yQVjQ_uivEgjWEg9HNQ9bqXqY_efk_vtdPerzcTEkU-mgXFPZWckX8fwVaU_mNsZO5PUdVzjDbX4HtY5baiqxWNtF-rnIOzfGDfYm http://www.cnpythoner.com/post/92.html [python]glob模

【Python】Python的urllib模块、urllib2模块进行网页下载文件

由于需要从某个网页上下载一些PDF文件,但是需要下载的PDF文件有几百个,所以不可能用人工点击来下载.正好Python有相关的模块,所以写了个程序来进行PDF文件的下载,顺便熟悉了Python的urllib模块和ulrllib2模块. 1.问题描述 需要从http://www.cvpapers.com/cvpr2014.html上下载几百个论文的PDF文件,该网页如下图所示: 2.问题解决 通过结合Python的urllib模块和urllib2模块来实现自动下载.代码如下: test.py #!

【Python】按行读取文件、IOError: [Errno 22] invalid mode (&#39;a+&#39;) or filename,处理文件的换行符

Python一次性读取文件的所有内容在<[Python]文件读写操作>(点击打开链接)中已经说明过的,但有些时候,需要对文件中的每一行进行处理. 比如有一个f:\1.txt如下: 此时,如果要按行读取这个文件,可以直接利用Pyhon的for循环来读取,其中for的对象是这个文件指针,代码如下: file_path="f:\\a.txt" fp=open(file_path,"a+"); for eachline in fp: print eachline

【Python】Python处理Json文件

最近用到Python来处理Json文件,对Python的Json模块熟悉了一下,下面是一个简单的程序用Python的Json模块来处理Json文件并写到一个新的Json文件中去,希望对大家有所帮助. 1.问题描述: 需要加载一个Json文件,并将Json中的某些项进行修改,然后写回到一个新的Json文件中去. 程序代码如下:test.py import json #导入Json模块 def processJson(inputJsonFile, outputJsonFile): fin = ope

【spring】通过GZIP压缩提高网络传输效率(可以实现任何资源的gzip压缩、包括AJAX)

 [spring]通过GZIP压缩提高网络传输效率(可以实现任何资源的gzip压缩.包括AJAX) gzip是http协议中使用的一种加密算法,客户端向web服务器端发出了请求后,通常情况下服务器端会将页面文件和其他资源,返回到客户端,客户端加载后渲染呈现,这种情况文件一般都比较大,如果开启Gzip ,那么服务器端响应后,会将页面,JS,CSS等文本文件或者其他文件通过高压缩算法将其压缩,然后传输到客户端,由客户端的浏览器负责解压缩与呈现.通常能节省40%以上的流量(一般都有60%左右),一

【安卓】数据库基于脚本的&quot;增量更新&quot;,每次更新时不需修改java代码、!

思路: 1.当然是基于SQLiteOpenHelper.onCreate(第一次安装程序时调用).onUpdate(升级程序时调用) 2.用"脚本"(脚本制作具体方法问度娘)做数据库升级,文件名标识对应版本,java中根据"上一版本.当前版本"选择执行的脚本. 升级时,修改DB_VERSION(当前版本)即可. DBManager.java: package com.example.test; import java.io.ByteArrayOutputStream