结构化文件存储
- 目的是为了解决文件在不同的系统中的交换
- 两种协议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)
来源:https://www.cnblogs.com/TK-tank/p/12322986.html