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

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对应的值

先将下面注释掉,执行写入文件那一段代码;再将写入文件注释,执行读取文件那一段,
运行结果:
<class ‘str’>
Ross

json模块的相关操作
  1. json字符串: 依照json的规则来存储的一类字符串

  2. 转化成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]
<class ‘str’>
<class ‘str’>
可以看到,在json字符串中,所有的单引号都会变成双引号

  1. 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’}
<class ‘dict’>
Ross

  1. 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’}
<class ‘dict’>
Ross

  1. 只要符合json规则的字符串就可以用loads() 转成相应类型
import json  #导入json模块

dic_str = '{"name":"Ross"}'  #一个符合json规范的字符串
data = json.loads(dic_str)
print(type(data))

运行结果:
<class ‘dict’>

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))  #最终是一个字节类型

运行结果:
<class ‘type’>

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。

  1. xml数据的样式
    很明显,是由一对一对标签嵌套组成的,标签内写入属性,成对的标签之间嵌入新标签
<?xml version="1.0"?>
<data>
    <country name="China">
        <rank updated="yes">2</rank>
        <year>2018</year>
    </country>
    <country name="America">
        <rank updated="yes">5</rank>
        <year>2019</year>
    </country>
    <country name="Singapore">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <neighbor name="Costa Rica" direction="W"/>
    </country>
</data>
  1. 导入xml模块
import xml.etree.ElementTree as ET
  1. 修改与删除标签
#修改
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模块就够用了

发布了18 篇原创文章 · 获赞 33 · 访问量 2303

猜你喜欢

转载自blog.csdn.net/Viewinfinitely/article/details/104780629