1 json
- json数据是一种只包含双引号的字符串格式,任何对象经过json序列化后单引号也会转成双引号。
import json
dic={'name':'alex'}
print(json.dumps(dic)) #{"name": "alex"}
i=8
print(json.dumps(i)) #8
print(type(json.dumps(i))) #
s='hello'
print(json.dumps(s)) #"hello"
print(type(json.dumps(s))) #
l=[11,22]
print(json.dumps(l)) #[11, 22]
-
JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:
dump()和load()函数
f=open('序列化对象','w')
f.write(j) #-------------------打开、写入两步等价于json.dump(dic,f)
f.close()
#-----------------------------反序列化
import json
f=open('序列化对象')
data=json.loads(f.read()) # 打开、读两步等价于data=json.load(f)
无论数据是怎样创建的,只要满足json格式,就可以json.loads出来,不一定非要dumps的数据才能loads
json.dumps()中的ensure_ascii=False
参考资料:https://www.jianshu.com/p/86d66257de41
>>> import json
>>> print json.dumps('中国') //json.dumps()中的中文默认按ascii编码输出
"\u4e2d\u56fd"
>>> print json.dumps('中国',ensure_ascii=False) //ensure_ascii=False表示不进行ascii编码
"中国"
2 pickle
- pickle是python特有的模块,不仅可以将对象序列化,还可以将类、函数等序列化。
- pickle的用法同json一样,区别是pickle序列化后的结果是字节,而json序列化后的结果是字符串。
- 使用举例:
import pickle
dic={'name':'lucy','age':18,'sex':'female'}
print(type(dic)) #
seria=pickle.dumps(dic)
print(seria) ##b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x12X\x04\x00\x00\x00nameq\x02X\x04\x00\x00\x00lucyq\x03X\x03\x00\x00\x00sexq\x04X\x06\x00\x00\x00femaleq\x05u.'
print(type(seria)) #
f=open('pickle序列化对象','wb') # 注意是w是写入str,wb是写入bytes,seria是'bytes'类型数据
f.write(seria) # -------------------等价于pickle.dump(dic,f)
f.close()
f=open('pickle序列化对象','rb')
data=pickle.loads(f.read()) #等价于data=pickle.load(f)
print(data['age']) #18
- 不建议使用,不同python版本之间可能不兼容
3 shelve模块
import shelve
#打开一个f
f = shelve.open(r'shelve.txt')
#写入数据
f['stu1_info']={'name':'alex','age':'18'}
f['stu2_info']={'name':'alvin','age':'20'}
f['school_info']={'website':'oldboyedu.com','city':'beijing'}
#获取数据
print(f.get('stu1_info')['age']) #18
#关闭f
f.close()
4 xml模块
作为可以在不同语言和程序之间进行数据交换的数据存储格式,xml比json更古老。
创建一个xmltest.xml文件,里面存储的数据如下:
2
2008
141100
5
2011
59900
69
2011
13600
- 数据读取
- 修改
import xml.etree.ElementTree as ET
tree=ET.parse("xmltest.xml") #创建tree解析对象
root=tree.getroot() #获取根节点
#修改
for node in root.iter('year'):
new_year=int(node.text) + 1 #找到year的节点,并将值加1
node.text=str(new_year) #将int转化成str,并赋值给text
node.set("update",'yes') #添加属性update
tree.write("xmltest.xml") #将修改重新写入xmltest.xml
结果:
- 删除node
import xml.etree.ElementTree as ET
tree=ET.parse("xmltest.xml") #创建tree解析对象
root=tree.getroot() #获取根节点
#删除node
for country in root.findall('country'):
rank=int(country.find('rank').text) #获取rank的值
if rank > 60:
root.remove(country) #删除rank>60的country
tree.write("output.xml")
- 代码创建xml
import xml.etree.ElementTree as ET
new_xml = ET.Element("namelist") #创建根节点为namelist的xml
name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"}) #添加子节点name
age = ET.SubElement(name, "age", attrib={"checked": "no"}) #添加子节点age
sex = ET.SubElement(name, "sex") #添加子节点sex
sex.text = '33' #设置sex的值
name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
age = ET.SubElement(name2, "age")
age.text = '19'
et = ET.ElementTree(new_xml) # 生成文档对象
et.write("test.xml", encoding="utf-8", xml_declaration=True) #写进xml文件
ET.dump(new_xml) # 打印生成的格式
生成的数据为: