Python 数据解析:JSON与XML

本文深入讲解JSON和XML的基础知识及应用技巧,包括JSON的数据结构、Python中JSON的处理方法、XML的基本语法,并提供了使用SAX和ElementTree解析XML的具体实例。
部署运行你感兴趣的模型镜像

目录

第1关:JSON篇:JSON基础知识

🌼代码:

第2关:JSON篇:使用json库

1,loads:用于将json字符串转换为python的字典

2,load:从json文件中读取数据

3,dumps:将python类型转换为json字符串 

4,dump:将Python类型转换为json字符串,并写入json文件中

5,编程要求 

🌼代码

第3关:XML篇:XML基础知识

🌼代码:

第4关:XML篇:使用SAX库解析XML

🌼代码

第5关:XML篇:使用ElementTree解析XML

🌼代码

总结补充:

XML和HTML真的跟文科一样,写的脑壳疼,要记的太多了

🍎经过多方面搜索后的个人理解🍌   

🍈还有头哥平台的学习🍗

🍌0基础能看懂的博客🍉

建议:新手一开始看会很陌生,建议边看边敲,不太理解先敲一遍再说。

第1关:JSON篇:JSON基础知识

本关任务:手动编写一个 JSON 格式的数据文件。

        json是Javascript里对象和数组中的对象

        本质上就是有特定结构的字符串

用来完成浏览器和服务器之间的数据的交换

它可以和python类型互相转换


  一个典型的 JSON 格式的字符串如下:

{
"students": 
    [
        {"name":"赵昊", "age": 15},
        {"name":"龙傲天", "age": 16},
        {"name":"叶良辰", "age": 17}
    ]
}

这里加上#注释,会报错,可能是javascript格式的原因

数据表示

        JSON 中数据都以名称:值的形式表示,名称包括在一对双引号" "中,值则有多种形式,多条数据之间用逗号,隔开,比如

"name":"赵昊"
"name":"赵昊","age":15

数据类型

JSON 的值可以是如下类型:

  • 字符串(在双引号中)
  • 数字(整数或浮点数)
  • 逻辑值(true 或 false
  • 数组(在中括号中)
  • 对象(在大括号中)
  • null 

比如

"name":"赵昊" , "age":15 , "height":170.5 , "ismale" : false , "house":null

数组

        数组在json中是中括号“[]”括起来的内容,类似于list,数据结构为[“java”, “javascript”, “vb”….] 取值方式和所有语言一样,使用索引获取,字段值的类型是:数字、字符串、数组、对象等

"names":["赵昊","龙傲天","叶良辰"]
"ages":[15,16,17]

对象

        对象在json中表示为”{}”括起来的内容,类似于dict,可以拥有多个(键)名称/值   对,

        数据结构为{key:value, key:value…}的键值对结构,

        属性值value可以为:数字、字符串、数组、对象等。

        在面向对象的语言中,key为对象的属性,value为对应属性的,所以很容易去理解。

"first":{"name":"赵昊", "age":15}

编程要求

创建一个 JSON 格式的字符串,要求:

  • 返回的 JSON 字符串代表一个对象
  • 对象的属性有:
    • students:一个数组,包含三个学生对象
    • count:学生的数量,在这里是3
  • 学生对象的属性:
    • 名称name,字符串类型
    • 年龄agenumber(int)类型
    • 是否为男性ismale,逻辑值类型

三个学生对象的数据:

  • 名称:赵昊,年龄:15,男性
  • 名称:龙傲天,年龄:16,男性
  • 名称:玛丽苏,年龄:15,女性

🌼代码:

{
    "students":
    [
        {
            "name": "赵昊", 
            "age": 15, 
            "ismale": true
        },
        {
            "name": "龙傲天",
            "age": 16, 
            "ismale": true
        },
        {
            "name": "玛丽苏",
            "age": 15,
            "ismale": false
        }
    ],
    "count": 3
}

测试说明
测试代码会解析这个文件内的 JSON 字符串,并将其中的数据打印出来。
如果文件成功解析而且数据填写正确

输出:

学生数:3
名称:赵昊,年龄:15,男性
名称:龙傲天,年龄:16,男性
名称:玛丽苏,年龄:15,女性

分析:

都喜欢多层嵌套,字典,元组,列表互相乱搞

1,最外层{}表示一个json对象,

(按字典理解)这个对象里有两个键值对,分别是  "students":[]  以及  "count": 3  ,其中第一个键值对中的值为列表,列表中又包含着3个{}括起来的小对象,每个小对象又有三个键值对        

(按面向对象理解)这个对象里有两个属性,属性"students",它的值为包含三个对象的列表;属性"count",它的值为3

第2关:JSON篇:使用json库

本关任务:编写一个能读取并修改 JSON 数据的程序

1,loads:用于将json字符串换为python的字典

import json
data = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
text = json.loads(data)
print(text)

输出

{'a':1, 'b':2, 'c':3, 'd':4, 'e':5}

json的对象类型转换成了 Python 的dict类型

JSON 各种数据类型在解析后,对应的 Python 基础数据类型如下表:

JSONPython
object(对象)dict
array(数组)list
string(字符串)unicode
number (int)int, long
number (real)float
trueTrue
falseFalse
nullNone

JSON 数据类型转化成 Python 数据类型后,就可以按照 Python 的方式来使用了:

import json
data = '[1,2,3]' #json字符串
text = json.loads(data) #json.loads()把json字符串转换成python列表类型
text.append(4) #调用list的append函数
print(text)

 输出

[1, 2, 3, 4]

如果需要以不同的字符编码来解析,可以指定encoding参数,比如:

import json
data = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
text = json.loads(data,encoding = "utf-8")
print(text)

这里使用utf8编码,可以解决很多无谓的中文问题

2,load:从json文件中读取数据

读取的数据自动转化为Python数据类型

json库的另一个函数load也是用于解析 JSON 数据的,它与loads函数唯一不同的地方在于,它是从文件中解析,比如:

import json
data = open("test.txt","r",encoding = "utf-8")
text = json.load(data) #将文件对象传递给load函数
print(text)
fp.close()

注意:load函数没有可选参数encoding,只要文件对象使用了正确的字符编码打开文件,load函数就可以正确的解析数据。

3,dumps:将python类型转换为json字符串 

import json
data = [ {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}]
json = json.dumps(data) #转化成JSON格式的字符串
print(json)

输出

[{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]

注意,这是一个字符串

同样,在转化的时候,也有一个 Python 基础数据类型到 JSON 数据类型的对应表格:

PythonJSON
dictobject
list, tuplearray
str, unicodestring
int, long, floatnumber
Truetrue
Falsefalse
Nonenull

注意:dumps没有可选参数encoding,当要转化的对象含有中文等非 ASCII 字符时,建议指定可选参数ensure_asciiFalse。否则非 ASCII 的字符将会被显示成\uXXXX的形式: 

data = {"name":"小明"}
print(json.dumps(data)) #ensure_ascii默认值为True
print(json.dumps(data,ensure_ascii= False)) #指定ensure_ascii为False

 输出

{"name": "\u5c0f\u660e"}
{"name": "小明"}

4,dump:将Python类型转换为json字符串,并写入json文件中

使用dump函数直接输出到文件也很简单,只需多传递一个文件对象作为参数 

import json
fp = open("test.txt","w")
data = [{'a':1, 'b':2, 'c':3, 'd':4, 'e':5}]
json.dump(data,fp) #转化成JSON格式的字符串后输出到文件
fp.close()
test.txt文件的内容:
[{"a":1, "b":2, "c":3, "d":4, "e":5}]

dump函数同样也没有可选参数encoding,如果有数据中有中文字符等非 ASCII 字符时,建议指定可选参数ensure_asciiFalse

5,编程要求 

有一个字符编码为utf-8的数据文件step2/2017.txt

{"count":3 , 
    "infos":
    [
        {"name":"赵昊", "age":15,"height":1.83, "sex":"男性"},
        {"name":"龙傲天", "age":16, "height":2.00, "sex":"男性"},
        {"name":"玛丽苏", "age":15, "height":1.78, "sex":"女性"}
    ]
}

 将其按 JSON 格式解析后,将infos数组内的三个对象的年龄age增加一岁,然后增加一条记录:

  • 名称:叶良辰,年龄:17,身高:1.87,男性

同时,将count的值从3改为4

注意:所有打开的文件,请在打开文件的函数内及时关闭,以免影响测试代码读取数据

测试说明 

测试代码会以 JSON 格式解析step2/2018.txt的内容,并将其中的数据打印出来。 如果内容成功解析,并且数据填写正确,将会有如下结果输出:

学生数:4
名称:赵昊,年龄:16,身高:1.83,男性
名称:龙傲天,年龄:17,身高:2.00,男性
名称:玛丽苏,年龄:16,身高:1.78,女性
名称:叶良辰,年龄:17,身高:1.87,男性

🌼代码

import json

def Func():
    data = open("step2/2017.txt","r",encoding = "utf-8")

    obj = json.load(data)#文件被json.load()解析后,返回python的字典

    data.close()
    
    #********** Begin *********#

    infos = obj["infos"] #obj是包含两个键值对的字典,第二个键值对的键是"infos",值是列表,而这个列表的三个元素是字典,每个字典又有四个键值对

    #上面将第二个键值对的值,也就是那个列表,赋值给infos变量,所以现在infos是列表
    for i in range(len(infos)): #等价于range(3)
        infos[i]["age"] += 1 #列表字典嵌套,这里看作特殊的二维列表,相当于一维列表的元素是字典
    infos.append({"name":"叶良辰", "age":17, "height":1.87, "sex":"男性"})
    obj["count"] = 4

    #********** End **********#
    output = open("step2/2018.txt","w",encoding = "utf-8")
    json.dump(obj,output) #json.dump()将字典obj转换为json字符串,并写入json文件
    output.close()

小总结 

loads     将json字符串python类型

load       从json文件中读取数据python类型

dumps   python类型json字符串

dump     python类型json字符串,并写入json文件

第3关:XML篇:XML基础知识

本关任务:手动编写一个 XML 格式的数据文件

一个典型的 XML 文件结构如下

<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

XML 的声明

<?xml version="1.0" encoding="utf-8"?>

以上定义了 XML 的版本1.0和所使用的编码utf-8

元素

XML 元素指的是 XML 文件中出现的标签,一个标签分为开始标签和结束标签,结束标签与开始标签名称相同,只是要在前面加一个斜杠/

<hello></hello>
<to></to>

一个标签中也可以嵌套其他的若干个子标签

<student>
    <name>赵昊</name>
    <age>16</age>
</student>

格式良好的 XML 文档必须有且仅有一个根元素,其他的元素都是这个元素的子孙元素

XML 没有保留字,元素名称可以任意使用

<hello></hello>
<F12></F12>
<if></if>
<!--上面这些都是合理的名称-->
<!--下面这些都是不合理的名称-->
<.123></.123>
<A D></A D>
<hello></Hello> <!--这一个是因为开始标记(hello)和结束标记(Hello)名称不同-->

 属性

一个元素可以有多个属性,每个属性都有它自己的名称和取值

属性的值一定要用双引号或者单引号括起来

<date year="2018" month="7" day="28"></date>

XML 文件中注释采用:<!--注释内容--> 这样的格式

<!--一个正确的注释1-->
<hello>
<!--一个正确的注释2-->

编程要求

根据提示,在右侧编辑器的文件中手动编写一个 XML 文件,要求:

  • 附带文档声明,使用 XML 版本1.0,字符编码为utf-8
  • 文档有一个根元素data,根元素有一个属性count,值为3
  • 根元素有三个student子元素,代表三个学生对象,每个子元素都有三个属性nameagesex(值为男性或者女性),它们的值由下面的数据得来。

三个学生对象的数据:

  • 名称:赵昊,年龄:15,男性
  • 名称:龙傲天,年龄:16,男性
  • 名称:玛丽苏,年龄:15,女性

测试说明

测试代码会以 XML 格式解析这个文件的内容,并将其中的数据打印出来。 如果内容解析成功而且数据填写正确,将会有如下结果输出

学生数:3
名称:赵昊,年龄:15,男性
名称:龙傲天,年龄:16,男性
名称:玛丽苏,年龄:15,女性

🌼代码:

<?xml version = "1.0" encoding = "utf-8"?>
<data count = "3"> 
<!--data(一个元素)可以有多个属性,count(属性)的值必须用引号括起来-->
<student name = "赵昊" age = "15" sex = "男性"></student>
<student name = "龙傲天" age = "16" sex = "男性"></student>
<student name = "玛丽苏" age = "15" sex = "女性"></student>
</data>

脑壳疼,休息会,先奉上头哥答案为敬

第4关:XML篇:使用SAX库解析XML

🌼代码

import xml.sax
class Handler(xml.sax.ContentHandler):
    #********** Begin *********#
    infostart = False
    def startElement(self,name,attrs):
        self.infostart = name == "info"
    def endElement(self,name):
        self.infostart = False
    def characters(self,content):
        if self.infostart:
            print(content)
    #********** End **********#                                 
def GetHandler():
    return Handler()

第5关:XML篇:使用ElementTree解析XML

🌼代码

import xml.etree.ElementTree as ET
class InfoManager:
    doc = None
    root = None
    def LoadInfo(self):
        self.doc = ET.parse("step5/data.xml")
        self.root = self.doc.getroot()

    def GetInfoCount(self):
        return int(self.root.get("count"))

    def GetAge(self,name):
        infos = self.root.findall("info")
        for s in infos: #搜索name属性与函数参数name的值相同的xml元素
            if s.get("name") == name:
                return int(s.get("age"))
        return 0 #随便返回一个值,评测代码不会有找不到的数据

    def GetDescription(self,name):

        infos = self.root.findall("info")
        for s in infos: #搜索name属性与函数参数name的值相同的xml元素
            if s.get("name") == name:
                return s.text
        return "" #随便返回一个值,评测代码不会有找不到的数据

总结补充:

xml和html之间的区别:

1、XML用于传输和存储数据,侧重于数据HTML用于显示数据并关注数据的外观

2、XML区分大小写;HTML不区分大小写

3、XML强制要求使用结束标记;而HTML中没有强制要求使用结束标记

4、XML保留空格;HTML不保留空格

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千帐灯无此声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值