json、pickle、shelve、XML、​ configparser​模块

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值