Python基础16 模块(5)常用标准库模块 json、pickle、shelve、xml

本文详细介绍了Python中json、pickle、shelve和xml模块的数据序列化与交互方法,包括json的dumps(),loads(),dump(),load(),pickle的更多支持,shelve的简单操作,以及xml的读写、遍历、修改和创建功能。
摘要由CSDN通过智能技术生成


本篇博文中的模块作用均为跨语言做数据交互,而 json库最重要,因为它可以对任何语言做数据交互。

一、json

1、json 和 Python 的数据类型对照

在这里插入图片描述

1、dumps() 和 loads() 方法

dumps() 的作用:序列化,将obj序列化为json格式str
(1)所有字符串外面的单引号都变成双引号
(2)所有变量都变为字符串
loads()
(1)反序列化
(2)解析数据的规则:字符串必须是双引号才能解析成Python的数据类型

import json
dic = {'name':'CTRao','age':18}
dics= json.dumps(dic)
print(dics,type(dics))  # {"name": "CTRao", "age": 18} <class 'str'>
with open("new","w",encoding="utf-8") as fw:
    fw.write(dics)

with open("new","r",encoding="utf-8") as fr:
    data = json.loads(fr.read())
    print(data["age"],type(data))  # 18 <class 'dict'>

2、dump() 和 load() 方法

与dumps() 和 loads() 方法类似,但是只能操作文件对象。

import json
dic = {'name':'CTRao','age':18}

with open("new","w",encoding="utf-8") as fw:
    json.dump(dic,fw)
''' 等效于 dics= json.dumps(dic)
          fw.write(dics)
'''

with open("new","r",encoding="utf-8") as fr:
    data = json.load(fr)    # 等效于data = json.loads(fr.read())
    print(data["age"],type(data))  # 18 <class 'dict'>

二、pickle

pickle支持的数据类型更多。方法与json类似。另外,pickle.dumps() 序列化后,返回的数据类型为字节型。

import pickle
dic = {'name':'CTRao','age':18}
dics= pickle.dumps(dic)
print(type(dics))   # <class 'bytes'>

with open("new2","wb") as fw:
    fw.write(dics)

with open("new2","rb") as fr:
    data = pickle.loads(fr.read())
    print(data["age"],type(data))  # 18 <class 'dict'>

三、shelve

shelve比pickle简单,只有一个open方法,返回类似字典的对象,可读可写。key必须为字符串,value可以是Python所支持的数据类型。

import shelve
f = shelve.open("new")
f["age"] = 18

print(f.get("age")) # 18
f.close()

四、xml

xml和json差不多,比json更早使用,所以也很重要。

1、读取xml文件,并获取根结点

import xml.etree.ElementTree as ET

tree = ET.parse("Fxml")
root = tree.getroot()

2、 遍历根节点的子结点和孙子结点

#遍历根结点的子结点
for i in root:
    print(i.tag) # 获取标签名
    print(i.attrib) # 获取属性,得到一个字典
    # 遍历根结点的孙子结点
    for j in i:
        print(j.tag)  # 获取标签名
        print(j.attrib)  # 获取属性,得到一个字典
        print(j.text)   #获取内容值

3、iter() 方法

创造一个树迭代器,遍历该结点的子孙,返回具有匹配标记的所有元素。

for child in root.iter("year"):
    print(child.tag, child.attrib,child.text)

4、findall() 方法

遍历子结点,返回按文档顺序包含所有匹配元素。

for child in root.findall("country"):
    print(child.tag, child.attrib)

5、find() 方法

返回第一个匹配的子结点

print(root.find("country").tag)

6、修改

for node in root.iter("year"):
    new_year = int(node.text) + 10
    node.text = str(new_year)
    node.set("update","yes")    # 增加year标签的属性

tree.write("Fxml")  # 从内存中,写进文件里

7、删除

for node in root.findall("country"):
    rank = int(node.find("rank").text)
    if rank > 50:
        root.remove(node)

tree.write("Fxml")  # 从内存中,写进文件里

8、创建

import xml.etree.ElementTree as ET

new_xml = ET.Element("namelist")

name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"})
age = ET.SubElement(name, "age", attrib={"checked": "no"})
sex = ET.SubElement(name, "sex")
sex.text = '33'
name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
age = ET.SubElement(name2, "age")
age.text = '19'

et = ET.ElementTree(new_xml)  # 生成文档对象
et.write("test.xml", encoding="utf-8", xml_declaration=True)

ET.dump(new_xml)  # 打印生成的格式
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值