目录
第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基础能看懂的博客
建议:新手一开始看会很陌生,建议边看边敲,不太理解先敲一遍再说。
本关任务:手动编写一个 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 格式的字符串,要求:
students
:一个数组,包含三个学生对象count
:学生的数量,在这里是3
个name
,字符串类型age
,number(int)
类型ismale
,逻辑值类型三个学生对象的数据:
{
"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
本关任务:编写一个能读取并修改 JSON 数据的程序
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编码,可以解决很多无谓的中文问题
读取的数据自动转化为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
函数就可以正确的解析数据。
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": "小明"}
使用
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
有一个字符编码为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
增加一岁,然后增加一条记录:
同时,将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文件
本关任务:手动编写一个 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 文件,要求:
1.0
,字符编码为utf-8
;data
,根元素有一个属性count
,值为3
;student
子元素,代表三个学生对象,每个子元素都有三个属性name
,age
,sex
(值为男性
或者女性
),它们的值由下面的数据得来。三个学生对象的数据:
测试说明
测试代码会以 XML 格式解析这个文件的内容,并将其中的数据打印出来。 如果内容解析成功而且数据填写正确,将会有如下结果输出
学生数:3
名称:赵昊,年龄:15,男性
名称:龙傲天,年龄:16,男性
名称:玛丽苏,年龄:15,女性
脑壳疼,休息会,先奉上头哥答案为敬
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()
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不保留空格