Python 数据解析:JSON与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 基础数据类型如下表:

JSON Python
object(对象) dict
array(数组) list
string(字符串) unicode
number (int) int, long
number (real) float
true True
false False
null None

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 数据类型的对应表格:

Python JSON
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null

注意: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 文件结构如下



Tove
Jani
Reminder
Don't forget me this weekend!

XML 的声明

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

元素

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


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


    赵昊
    16

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

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






<.123>

 

 属性

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

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

XML 文件中注释采用: 这样的格式



编程要求

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

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

三个学生对象的数据:

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

测试说明

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

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

代码:


 






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

第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不保留空格

你可能感兴趣的:(Python机器学习,json,xml,python)