105.格式化文件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.minidomfrom xml.dom.minidom import parse#读取文件形成树文件DOMtree = xml.dom.minidom.parse("./t.xml")#通过树文件,实例根节点doc = DOMtree.documentElementprint(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.ElementTreeroot = 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"])

创建xml文件

  • 更改方式
    • ele.set:更改属性
    • ele.append:添加子元素
    • ele.remove:删除元素
  • 第一种方式
import xml.etree.ElementTree as ETnote = 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 ETnote = 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")#给根节点添加子元素namename = ET.SubElement(note, "name")#添加属性name.attrib = {"w":"w", "h":"h"}#添加内容name.text = "abcd"#给根节点添加子元素datedate = 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 jsonj = {"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 jsonj = {"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)

相关文章