结构化文件存储
- 目的是为了解决文件在不同的系统中的交换
- 两种协议xml,json
- xml侧重于描述数据本身,即数据的结构和语义
- html侧重于如何显示web页面的数据
- 网页三剑客
- html 网页中有什么数据
- css 网页美化
- javascript 页面功能
- xml参考资料
- json参考资料
xml
- 可扩展的标记语言(eXtensible Markup Language),是w3c组织指定的标准,比html更简单一些
- 标记语言:语言中使用<>括取来的文本字符串作为标记
- 可扩展:用户可以自己定义需要的标记,html不行
xml文档的构成
- 处理指令(可以认为一个文件内只有一个处理指令)
- 最多只有一行
- 必须在第一行
- 与xml本身处理相关的一些生命和指令
- 以?xml开头
- 一般用于声明xml的版本和采用的编码
- version属性是必须的
- encoding属性用来指出xml解释器使用的编码
- 根元素(一个文件内只有一个根元素)
-在xml文件中,可以把他看做是一个树形结构- 有切只能有一个
- 子元素
-根元素下所有的元素,都是子元素 - 属性
- 提供有关元素的额外信息
- 通常提供不属于数据组成部分的信息
- 值必须使用引号,单引号双引号都行,内容中有单引号,就使用双引号,反之亦然
- 内容
- 注释
- 其说明左右的信息
- 注释不能在标签内
- 注释内不可以有一个以上的短横线
- 保留字符
<?xml version="1.0" encoding="utf-8"?>
<note>
<xsq>
<name>显示器</name>
<date>2018/01/01</date>
</xsq>
<sb>
<name>鼠标</name>
<date>2019/01/01</date>
</sb>
<jp>
<name>键盘</name>
<date>2020/01/01</date>
</jp>
</note>
xml访问
读取
- 分为两个主要技术 SAX 和 DOM
- SAX
- 基于事件驱动
- 用SAX解析文档涉及到解析器和事件处理器
- 特点:
- 快
- 流式读取
- DOM
-
是W3C规定的XML编程接口,推荐
-
读取一个xml文件,以属性结构保存到缓存中
-
用途
- 定位浏览xml任何一个节点的信息
- 添加删除相应的内容
-
minidom和etree
- minidom
- minidom.parse(filename):加载读取的xml文件,也可以是xml代码
- .documentElement:获取xml文档对象,一个xml文件只有一个对应的文档对象
- .getAttribute(attr_name):获取xml节点属性 attr_name属性名
- .getElementByTagName(tage_name):得到一个节点对象的集合 tage_name节点名
- .childNodes:得到所有子节点的列表
- .childNodes[index].nodeValue:获得单个节点的值
- .firstNode:获得第一个节点,等价于.childNodes[0]
- .attributes[tage_name]
import xml.dom.minidom from xml.dom.minidom import parse #读取文件形成树文件 DOMtree = xml.dom.minidom.parse("./t.xml") #通过树文件,实例根节点 doc = DOMtree.documentElement print(list(doc.childNodes)) #遍历根节点的子节点 for i in doc.childNodes: #便利子节点的子节点 for n in i.childNodes: if n.nodeName == "name": print(n.childNodes[0].data) if n.nodeName == "date": print(n.childNodes[0].data)
- etree
- .getiterator 得到相应可迭代的node集合
- .lite 同上
- .find(node_name) 查找置顶名字的节点。返回一个node
- .findall(node_name) 返回多个node_name的节点
- .tag 节点名
- .text 节点文本
- .attrib node属性的字典类型内容
import xml.etree.ElementTree root = xml.etree.ElementTree.parse("./t.xml") #利用getiterator访问 nodes = root.getiterator() for node in nodes: print("{0}--{1}".format(node.tag, node.text)) print("-" * 30) #利用find和findall方法访问 jpm = root.find("jp") print("{0}--{1}".format(jpm.tag, jpm.text)) print("-" * 30) l = root.findall("jp") for i in l: print("{0}--{1}".format(i.tag, i.text)) for n in i.iter(): if n.tag == "name": f "other" in n.attrib.keys(): print(n.attrib["other"])
- minidom
-
创建xml文件
-
更改方式
- ele.set:更改属性
- ele.append:添加子元素
- ele.remove:删除元素
-
第一种方式
import xml.etree.ElementTree as ET
note = ET.Element("note")
name = ET.Element("name", {"a":"A"})
date = ET.Element("date", {"b":"B"})
note.append(name)
note.append(date)
t = ET.ElementTree(note)
t.write('family_tree.xml',
encoding='utf-8',
short_empty_elements=False,
xml_declaration=True)
- 第二种方式
import xml.etree.ElementTree as ET
note = ET.Element("note")
name = note.makeelement("name", {"a":"A"})
date = note.makeelement("date", {"b":"B"})
note.append(name)
note.append(date)
t = ET.ElementTree(note)
t.write('family_tree.xml',
encoding='utf-8',
short_empty_elements=False,
xml_declaration=True)
- 第三种方式
import xml.etree.ElementTree as ET
#创建根节点
note = ET.Element("note")
#给根节点添加子元素name
name = ET.SubElement(note, "name")
#添加属性
name.attrib = {"w":"w", "h":"h"}
#添加内容
name.text = "abcd"
#给根节点添加子元素date
date = ET.SubElement(note, "date")
date.text = "qwer"
#创建树文件
t = ET.ElementTree(note)
#用树文件创建xml文件,并写入建好的结构
t.write('family_tree.xml',
encoding='utf-8',
short_empty_elements=False,
xml_declaration=True)
json
- 轻量级的数据交换格式
- 格式是一个键值对形式的数据集
- key:必须是字符串
- value:字符串,数字,列表,json(可以嵌套)
- 使用大括号包裹
json包
- json和python相互转换
- json.dumps():把python格式转化为json格式
- json.loads():把json格式转化为python格式
- python读取json文件
- json.dump():把内容写入文件
- json.load():把json文件读入python
import json
j = {"name":"a", "date":"b"}
#把字典转化成json格式的字符串
js = json.dumps(j)
print(type(js))
print(js)
#把json格式字符串转化成python字典
js = json.loads(js)
print(type(js))
print(js)
import json
j = {"name":"a", "date":"b"}
#把python的字典,以json的格式写入文件
with open("t.json", "w") as t:
json.dump(j, t)
#读取json文件,转化为python的字典形式
with open("t.json", "r") as t:
p = json.load(t)
print(type(p))
print(p)