json模块、pickle模块、xml模块、shelve模块这四个模块都是数据交换的桥梁。
所谓数据交换,简单来说就是每门编程语言都有自己对应的数据类型,如果要在不同的语言或程序之间进行数据交换,需要用这四个模块转换一下,这样就能保证原有的数据类型不会变。其中json模块是最好用的。
每门语言都遵守json字符串的规则,就可以相互之间交换数据,并且保证数据类型不会变
正常数据转化(复杂)#写入文件
#dic = "{'name':'Ross'}" #将字典转成字符串
#f = open('test.txt','w') #以可读方式打开文件
#f.write(dic) #将转化成字符串的字典写入,写入后已经不是一个字典了
#f.close()
#读取文件
f_read = open('test.txt','r')
data = f_read.read() #将文件字符读取出来
print(type(data)) #发现读取出的不再是字典,只是字符串
data = eval(data) #将字符串转成对应的字典
print(data['name']) #去name对应的值
先将下面注释掉,执行写入文件那一段代码;再将写入文件注释,执行读取文件那一段,
运行结果:
Ross
json字符串: 依照json的规则来存储的一类字符串
转化成json字符串
import json #导入json模块
dic = {'name':'Ross'}
li = [11,33,22]
data = json.dumps(dic) #将其他类型转成json字符串类型
data2 = json.dumps(li)
print(data)
print(data2)
print(type(data)) #输出元素的类型
print(type(data2))
运行结果:
{“name”: “Ross”}
[11, 33, 22]
可以看到,在json字符串中,所有的单引号都会变成双引号
import json #导入json模块
#写入文件
'''dic = {'name':'Ross'}
dic_str = json.dumps(dic) #将字典封装成json字符串
with open('test.txt','w',encoding='gbk') as f: #windows默认编码'gbk'
f.write(dic_str)'''
#读取文件
with open('test.txt','r') as f_read:
data = json.loads(f_read.read()) #载入json字符串,用loads()方法将其转回原来的字典类型
print(data)
print(type(data)) #类型已经变回字典了
print(data['name']) #用name去对应的值
同样先将下面注释掉,执行写入文件那一段代码;再将写入文件注释,执行读取文件那一段,
运行结果:
{‘name’: ‘Ross’}
Ross
import json #导入json模块
#写入文件
'''dic = {'name':'Ross'}
with open('test.txt','r+',encoding='gbk') as f:
json.dump(dic,f) #将字典封装成json字符串,并写入f这个打开的文件'''
#读取文件
with open('test.txt','r') as f_read:
data = json.load(f_read)
#载入json字符串,用load()方法将其转回原来的字典类型
#与loads()不同,这里只需要传入文件名就行,不需要读的操作
print(data)
print(type(data)) #类型已经变回字典了
print(data['name']) #用name去对应的值
先执行写入文件,再执行读取文件,
运行结果:
{‘name’: ‘Ross’}
Ross
import json #导入json模块
dic_str = '{"name":"Ross"}' #一个符合json规范的字符串
data = json.loads(dic_str)
print(type(data))
运行结果:
在作用上与json几乎完全相同,参见篇首json的作用,但是pickle是用二进制储存,json是用json字符串储存,一般用json就够了
import pickle #导入pickle模块
dic = {'name':'Ross'}
dic_str = pickle.dumps(str) #pickle成字符串
data = pickle.loads(dic_str) #载入成字符串对应的字节,但其实就是字典类型
print(type(data)) #最终是一个字节类型
运行结果:
shelve模块比pickle模块用法简单,只有一个open函数,返回类似字典的对象,可读可写;
但是字典的key必须为字符串,而值可以是python所支持的数据类
import shelve
f = shelve.open(r'test.txt') #直接就可以用shelve打开文件
#写入文件
f['stu1']={'name':'alex','age':'18'} #stul、stu2是需要添加字典的键,字典中分别加入了两个键值对
f['stu2']={'name':'alvin','age':'20'}
f['school']={'website':'Iloveyou.com','city':'Sichuan'}
f.close()
#读取文件
#print(f.get('stu_info')['age'])
同样,先执行写入文件,再执行读取文件
xml模块xml也是进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,由于xml诞生很早,传统行业用的人比较多,至今很多传统公司如金融行业的很多系统的接口还主要是xml。
xml数据的样式
2
2018
5
2019
69
2011
导入xml模块
import xml.etree.ElementTree as ET
修改与删除标签
#修改
for node in root.iter('year'):
new_year = int(node.text) + 1 #把年份都加1
node.set("updated","yes") #更新数据
tree.write("xmltest.xml") #写入xml文件
#删除node
for country in root.findall('country'): #遍历每个国家的rank标签
rank = int(country.find('rank').text)
if rank > 50:
root.remove(country)
tree.write('output.xml')
到此为止,数据交换方面的四大模块,json模块、pickle模块、xml模块、shelve模块都总结完了。其实,如果熟练的话,一个json模块就够用了