1、json和xml
Json:javascript notation
json串:“{‘a’:1}”
看起来很像字典,但是实际上是个字符串,字典和字符串还可以互转。
例如:
>>> import json
>>> d={"a":100}
>>> json.dumps(d)
'{"a": 100}'
>>> s=json.dumps(d)#.dumps可以将字典转化为字符串
>>> s
'{"a": 100}'
>>> type(s)
<class 'str'>
>>> type(d)
<class 'dict'>
>>> s="{'a':1000}"
>>> s
"{'a':1000}"
与str的区别:
>>> d
{'a': 100}
>>> type(d)
<class 'dict'>
>>> str(d)
"{'a': 100}"
>>> d={"abc":None}
>>> json.dumps(d)
'{"abc": null}'
>>> str(d)
"{'abc': None}"
2、json和xml:都是用来存储数据的
json和xml:
json:javascript notation
json串:"{‘a’:1}"
看起来很像是个字典,但是实际是是个字符串
字典和字符串还可以互转。
json和xml:都是用来存储数据的。
restful接口,基本都用的是json来传输数据的。
xml:也可以用于传输数据。银行的老系统:soap协议:http+xml
python:字典、列表和元组,集合(存在内存里的格式)
,在网络上能被认出来么? 不能。因为没有编译器,认不出来的。
因为python的数据无法在网上做传输。
把想传输的数据转换为json就可以去传输数据了。
在网络上传输的数据:字符串
import json
data=[{'a':1,'b':2,'c':3,'d':4,'e':5}]
data2=json.dumps(data)
print(data2)
import json
data=[{'a':1,'b':2,'c':3,'d':4,'e':5}]
data2=json.dumps({'a':'Runoob','b':7},sort_keys=True,indent=4,separators=(',',':'))
print(data2)
>>> import json
>>> s={"x":1.234,"abc":None,"y":[2,3],"z":(1,2),"b":100}
>>> json.dumps(s)
'{"x": 1.234, "abc": null, "y": [2, 3], "z": [1, 2], "b": 100}'
>>> a = json.loads(s)
>>> a
{'x': 1.234, 'abc': None, 'y': [2, 3], 'z': [1, 2], 'b': 100}
>>> type(a)
<class 'dict'>
3、给你一个json串,需要转回为Python对象。如何判断json是个可以合法转回的合法json串。
import json
try:
json.loads(xx)
except:
print("是个非法的json串")
else:
print("是个合法的字符串")
s = {
"labels":[
{
"name":"Audi_TTS_Coupe_2012",
"x1":39,
"y1":116,
"x2":569,
"y2":375
}
]
}
'''
{'labels':
[
{'rect':
[
{'x': 39,
'y': 116
},
{'x': 569,
'y': 375}
] ,
'labels': [
{'value': 'Audi_TTS_Coupe_2012',
'key': 'default'}
]
}
]
}
'''
def convert(s):
name = s["labels"][0]["name"]
x1 = s["labels"][0]["x1"]
x2 = s["labels"][0]["x2"]
y1 = s["labels"][0]["y1"]
y2 = s["labels"][0]["y2"]
s1={
"labels":[
{
"rect":[
{
"x":"xx",
"y":"xx" },
{
"x":"xx",
"y":"xx" }
],
"labels":[
{
"value":"xx",
"key":"default"
}
]
}
]
}
s1["labels"][0]["rect"][0]["x"]=x1
s1["labels"][0]["rect"][0]["y"]=y1
s1["labels"][0]["rect"][1]["x"]=x2
s1["labels"][0]["rect"][1]["y"]=y2
s1["labels"][0]["labels"][0]["value"]=name
return s1
print(convert(s))
>>> s = { "labels":[
... {
... "name":"Audi_TTS_Coupe_2012",
... "x1":39,
... "y1":116,
... "x2":569,
... "y2":375
... }
... ]
... }
>>> s["labels"]
[{'name': 'Audi_TTS_Coupe_2012', 'x1': 39, 'y1': 116, 'x2': 569, 'y2': 375}]
>>> s["labels"][0]
{'name': 'Audi_TTS_Coupe_2012', 'x1': 39, 'y1': 116, 'x2': 569, 'y2': 375}
>>> s["labels"][0]["name"]
'Audi_TTS_Coupe_2012'
>>> s["labels"][0]["x1"]
39
>>> s["labels"][0]["y1"]
116
>>> name = s["labels"][0]["name"]
>>> name
'Audi_TTS_Coupe_2012'
>>> new_json = {"lable":[{"new_name":"xx"}]}
>>> new_json["lable"]
[{'new_name': 'xx'}]
>>> new_json["lable"][0]
{'new_name': 'xx'}
>>> new_json["lable"][0]["new_name"]=name
>>> new_json
{'lable': [{'new_name': 'Audi_TTS_Coupe_2012'}]}
>>> re.search(r"'name'",json.dumps(s))
>>> re.search(r"name",json.dumps(s))
<_sre.SRE_Match object; span=(14, 18), match='name'>
>>> re.search(r"name\"",json.dumps(s))
<_sre.SRE_Match object; span=(14, 19), match='name"'>
>>> re.search(r"name\":",json.dumps(s))
<_sre.SRE_Match object; span=(14, 20), match='name":'>
>>> re.search(r"name\":" ,json.dumps(s))
<_sre.SRE_Match object; span=(14, 20), match='name":'>
>>> re.search(r"name\": " ,json.dumps(s))
<_sre.SRE_Match object; span=(14, 21), match='name": '>
>>> re.search(r"name\": \"" ,json.dumps(s))
<_sre.SRE_Match object; span=(14, 22), match='name": "'>
>>> re.search(r"name\": \"\w+" ,json.dumps(s))
<_sre.SRE_Match object; span=(14, 41), match='name": "Audi_TTS_Coupe_2012'>
>>> re.search(r"name\": \"\w+\"" ,json.dumps(s))
<_sre.SRE_Match object; span=(14, 42), match='name": "Audi_TTS_Coupe_2012"'>
>>> re.search(r"name\": \"\w+\"" ,json.dumps(s)).group()
'name": "Audi_TTS_Coupe_2012"'
>>> re.search(r"name\": \"(\w+)\"" ,json.dumps(s)).group()
'name": "Audi_TTS_Coupe_2012"'
>>> re.search(r"name\": \"(\w+)\"" ,json.dumps(s)).group(1)
'Audi_TTS_Coupe_2012'
<collection shelf="New Arrivals">
<movie title="Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
<movie title="Trigun">
<type>Anime, Action</type>
<format>DVD</format>
<episodes>4</episodes>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
<type>Comedy</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom</description>
</movie>
</collection>
4、movie :标签名
title=“Transformers”:属性
:子标签
标签中间的文字:Comedy,—》文本节点
解析:从文件中,通过分析文件,拿到我们想要的数据
文件通常要保存为utf-8格式
解析:三种方式
1 dom(把整个xml放到内存中使用)
效率高,但是浪费内存
2 sax(从xml文件中一行一行的去读,不会全部加载)
节省内存
3 etree
可以使用xpath方式定位,很方便。//movie[@title=“Ishtar”]
可能是类似第一种
>>> from xml.dom.minidom import parse
>>> import xml.dom.minidom
>>> DOMTree = xml.dom.minidom.parse("movies.xml")
>>> collection = DOMTree.documentElement
>>> collection
<DOM Element: collection at 0x26060e0>
>>> collection.getAttribute("shelf")
'New Arrivals'
>>> if collection.hasAttribute("shelf"):
... print ("Root element : %s" % collection.getAttribute("shelf"))
...
Root element : New Arrivals
# 在集合中获取所有电影,从某个节点下,或者下面你的指定子节点
movies = collection.getElementsByTagName("movie")
>>> movies[0]
<DOM Element: movie at 0x2606508>
>>> movies[0]
<DOM Element: movie at 0x2606508>
>>> movies[0].toxml()
'<movie title="Enemy Behind">\n <type>War, Thriller<hh>我们</hh></type>\n <f
ormat>DVD</format>\n <year>2003</year>\n <rating>PG</rating>\n <stars>10</
stars>\n <description>Talk about a US-Japan war</description>\n</movie>'
找到这个标签description>Vash the Stampede!</description>里面的文本内容。
>>> movies[2]
<DOM Element: movie at 0x2606df0>
>>> movies[2].getElementsByTagName("description")
[<DOM Element: description at 0x2664210>]
>>> movies[2].getElementsByTagName("description")
[<DOM Element: description at 0x2664210>]
>>> movies[2].getElementsByTagName("description").childNodes
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NodeList' object has no attribute 'childNodes'
>>> movies[2].getElementsByTagName("description")[0]
<DOM Element: description at 0x2664210>
>>> movies[2].getElementsByTagName("description")[0].childNodes
[<DOM Text node "'Vash the S'...">]
>>> movies[2].getElementsByTagName("description")[0].childNodes[0]
<DOM Text node "'Vash the S'...">
>>> movies[2].getElementsByTagName("description")[0].childNodes[0].data
'Vash the Stampede!'
# 打印每部电影的详细信息
for movie in movies:
print ("*****Movie*****")
if movie.hasAttribute("title"):
print ("Title: %s" % movie.getAttribute("title"))
type = movie.getElementsByTagName('type')[0]
print ("Type: %s" % type.childNodes[0].data)
format = movie.getElementsByTagName('format')[0]
print ("Format: %s" % format.childNodes[0].data)
rating = movie.getElementsByTagName('rating')[0]
print ("Rating: %s" % rating.childNodes[0].data)
description = movie.getElementsByTagName('description')[0]
print ("Description: %s" % description.childNodes[0].data)
movies[2]:表示取到第三个电影的dom element对象
getElementsByTagName('description'):获取第三个电影下的
名字叫做description的所有子dom element对象,返回的是个列表
.getElementsByTagName('description')[0]:从列表中去第一个对象
.childNodes:表示从description 的对象中找到所有子节点对象
返回的是个列表
childNodes[0]:表示从列表中取第一个,对应的是文本节点
.data:把文件节点的文字内容取出来