JSON编码器和解码器(通用)
json,用于字符串 和 python数据类型间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
json.dumps | 将 Python 对象编码成 JSON 字符串 |
json.loads | 将已编码的 JSON 字符串解码为 Python 对象 |
json.dump | 将Python对象以JSON格式保存到文件 |
json.load | 从文件中读取JSON对象并存储为Python对象 |
序列化是干啥用的?
虚拟机挂起时,保存的状态保存在文件里,怎么样保存的,相当于把内存中的数据对象复制下来保存到硬盘里,内存的数据对象可不只字符串,序列化就是把内存的数据对象转换成字符串
序列化: 将对象转换为字节序列。
反序列化:将字节序列转换为对象。
序列化
#序列化
import json
set_1 = {
"name":"天天",
"age":21
}
f = open("test.txt","w")
f.write(json.dumps(set_1))
#json.dump(set_1,f) 和上面的代码相等效果
f.close()
# test.txt的内容为{"name": "\u5929\u5929", "age": 21}
反序列化
import json
#反序列化
f = open("test.txt","r")
data = json.loads(f.read())
#data = json.load(f) #和上面的效果相等
print(data["name"])
结果: 天天
pickle(python中特有的)
pickle,用于python特有的类型 和 python的数据类型间进行转换
pickle模块提供了四个功能:dumps、dump、loads、load
pickle.dump() | 将任意对象转化成bytes,并写入文件中。 |
pickle.dumps() | 将任意对象转化成bytes. |
pickle.loads() | 从bytes中反序列化出对象 |
pickle.load() | 从文件中反序列出对象 |
序列化
import pickle
set_1 = {
"name":"天天",
"age":21
}
f = open("test.txt","wb")
f.write(pickle.dumps(set_1))
#pickle.dump(set_1,f)
f.close()
#test.txt中的内容�� }�(�name��天天��age�Ku.
反序列化
import pickle
f = open("test.txt","rb")
data = pickle.loads(f.read())
#data = pickle.load(f)
print(data["name"])
Python-shelve库
shelve是python中用来持久化存储的模块,类似于一个key-value的数据库,但是这里的value不限定类型,可以是python中任意的数据类型,也可以是自己定义的数据类型。可以持久化任何pickle可支持的python数据格式
import shelve,datetime
d = shelve.open('a.txt') #打开文件
info = {"age":21,"obj":"get"}
name = [1,2,3,4,5]
d["name"] = name #持久化列表
d["info"] = info #持久dict
d['date'] = datetime.datetime.now()
d.close()
import shelve,datetime
d = shelve.open('a.txt') #打开文件
print(d.get("name"))
print(d.get("info"))
print(d.get("date"))
XML模块
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过在json还没诞生
的年代,大家只能选择用xml呀
xml结构
<?xml version="1.0" encoding="utf-8" ?>
<公司>
<客户 ID="01">
<名字>小李.</名字>
<电话>12345</电话>
<地址 省="广东" 市="广州" />
<注解>
<![CDATA[从三年前的老客户]]>
</注解>
</客户>
使用以下 XML 文档作为本节的示例数据:
<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank>1</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank>4</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank>68</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>
print(memoryobj.tag)
print(memoryobj[0].attrib) #{'name': 'Liechtenstein'} 第一层
print(memoryobj[0][0].text) #2 第二层
print(memoryobj[0][0].attrib) #{'updated': 'yes'} 字典
查
import xml.etree.ElementTree as ET
tree = ET.parse("xml_0.xml") #解析 xml
root = tree.getroot() #内存对象 root
for label in root: #遍历标签 country {'name': 'Liechtenstein'}
print(label.tag,label.attrib)
for i in label: #遍历标签内部里的内容
print(i.tag,i.text,i.attrib) #i.tag = rank i.text = 1 i.attrib={'name': 'Austria', 'direction': 'E'}
#遍历xml文档 写入文本中 #with语句 为了避免打开文件后忘记关闭,可以通过管理上下文,当wth代码块执行完毕时,内部会自动关闭并释放文件资源。
with open("xml0.txt","w+",encoding="utf-8") as fp:
for label in root:
print(label.tag, label.attrib,file=fp)
for i in label:
print(i.tag,i.text,i.attrib,file=fp)
#只遍历其中的一个节点
for node in root.iter('neighbor'):
print(node.tag,node.text,node.attrib)
修改,增加
#修改其中一个
tree = ET.parse("xml_0.xml") #解析 xml
root = tree.getroot() #内存对象 root
for rank in root.iter(root[0].tag):
a = rank.attrib
if 'Singapore' in a.values():
b = rank.find("neighbor")
b.text = str("351315") #修改
b.set('updated','yes') #增加
b.set('name','3113') #修改
tree.write('output.xml')
删除
import xml.etree.ElementTree as ET
tree = ET.parse("xml_0.xml") #解析 xml
root = tree.getroot() #内存对象 root
for rank in root.findall('country'): #查找
rank.remove(rank.find("neighbor")) #查找
tree.write('output.xml')
#删除 Singapore 中的 year
for rank in root.iter(root[0].tag):
a = rank.attrib
if "Singapore" in a.values():
b = rank.find("year")
rank.remove(b)
tree.write('output.xml')
configparser--配置文件解析器
使用configparser写配置文件
import configparser
config = configparser.ConfigParser()
方法1
config['DEFAULT'] = {'ServerAliveInterval': '45',
'Compression': 'yes',
'CompressionLevel': '9'}
方法2
config['bitbucket.org'] = {} #标题空字典
config['bitbucket.org']['User'] = 'hg' #标题下的字典
config['topsecret.server.com'] = {} #标题
topsecret = config['topsecret.server.com'] #标题
topsecret['Port'] = '50022' # #标题下的字典
topsecret['ForwardX11'] = 'no' # #标题下的字典
config['DEFAULT']['ForwardX11'] = 'yes' #添加 到DEFAULT下
with open('example.ini', 'w',encoding='utf-8') as configfile:
config.write(configfile) #写入
结果 example.ini 文件
[DEFAULT]
serveraliveinterval = 45
compression = yes
compressionlevel = 9
forwardx11 = yes
[bitbucket.org]
user = hg
[topsecret.server.com]
port = 50022
forwardx11 = no
查
import configparser
config = configparser.ConfigParser()
config.read('example.ini',encoding='utf-8')
print(config.sections()) #分段
print(config.defaults()) #默认 DEFAULT下的内容
print(config.has_section("topsecret.server.com")) #True 是否有
print(config['bitbucket.org']['user']) #查看user的结果
结果
['bitbucket.org', 'topsecret.server.com']
{'serveraliveinterval': '45', 'compression': 'yes', 'compressionlevel': '9', 'forwardx11': 'yes'}
True
hg
增 删 改
import configparser
config = configparser.ConfigParser()
config.read('example.ini',encoding='utf-8')
config.remove_section('bitbucket.org') #删除
config.add_section("bitbucke") #添加 如果有bitbucke会出错
config["bitbucke"]['asdg']= '123'
config.write(open('example.ini','w'))
[DEFAULT]
serveraliveinterval = 45
compression = yes
compressionlevel = 9
forwardx11 = yes
[topsecret.server.com]
port = 50022
forwardx11 = no
[bitbucke]
asdg = 123