目录
1,loads:用于将json字符串转换为python的字典
4,dump:将Python类型转换为json字符串,并写入json文件中
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,字符串类型 - 年龄
age,number(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_ascii为False。否则非 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_ascii为False
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子元素,代表三个学生对象,每个子元素都有三个属性name,age,sex(值为男性或者女性),它们的值由下面的数据得来。
三个学生对象的数据:
- 名称:赵昊,年龄: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不保留空格
本文深入讲解JSON和XML的基础知识及应用技巧,包括JSON的数据结构、Python中JSON的处理方法、XML的基本语法,并提供了使用SAX和ElementTree解析XML的具体实例。
1424

被折叠的 条评论
为什么被折叠?



