初学者python笔记(json模块、pickle模块、xml模块、shelve模块)

Petunia ·
更新时间:2024-09-21
· 624 次阅读

json模块、pickle模块、xml模块、shelve模块这四个模块都是数据交换的桥梁。
所谓数据交换,简单来说就是每门编程语言都有自己对应的数据类型,如果要在不同的语言或程序之间进行数据交换,需要用这四个模块转换一下,这样就能保证原有的数据类型不会变。其中json模块是最好用的。

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的规则来存储的一类字符串

转化成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字符串中,所有的单引号都会变成双引号

json在文件中操作(dumps()、loads()) 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

json在文件中操作(dump()、load())
与dumps()和loads()的区别是,dump()、load()专门处理文件 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

只要符合json规则的字符串就可以用loads() 转成相应类型 import json #导入json模块 dic_str = '{"name":"Ross"}' #一个符合json规范的字符串 data = json.loads(dic_str) print(type(data))

运行结果:

pickle模块

在作用上与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模块

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模块就够用了


作者:栀丶子



pickle XML JSON Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号