105.格式化文件xml与json

感情迁移 提交于 2020-02-17 19:01:40

结构化文件存储

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"])

创建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)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!