接上篇《17、文件的读写操作》
上一篇我们学习了Python文件对象包含哪些方法,并学习了文件如何进行读、写、定位和删除。本篇我们来学习文件读取及写入数据序列化和反序列化的操作。
一、什么是序列化和反序列化
通过文件操作,我们可以将字符串写入到一个本地文件。但是,如果是一个对象(例如列表、字典、元组等),就无法直接写入到一个文件里,需要对这个对象进行序列化,然后才能写入到文件里。
设计一套协议,按照某种规则,把内存中的数据转换为字节序列,保存到文件,这就是序列化。反之,从文件的字节序列恢复到内存中,就是反序列化。
Python中提供了JSON这个模块用来实现数据的序列化和反序列化。
二、JSON模块
JSON(JavaScriptObjectNotation,JS对象简谱)是一种轻量级的数据交换标准。JSON的本质是字符串。下面是一个标准的JSON字符串,表达了一个Person对象,其中包含了“name”、“age”、“cars”属性(姓名、年龄、拥有的车):
{
"name": "Bill Gates",
"age": 62,
"cars": ["Porsche", "BMW", "Volvo"]
}
这个JSON字符串如果被序列化为对象后,使用它是这样的:
person = {
"name": "Bill Gates",
"age": 62,
"cars": ["Porsche", "BMW", "Volvo"]
}
print("人物姓名:", person['name'])
print("人物年龄:", person['age'])
print("拥有的车辆:")
carList = person['cars']
i = 1
for car in carList:
print(f"第{i}辆车是:", car)
i += 1
效果:
人物姓名: Bill Gates
人物年龄: 62
拥有的车辆:
第1辆车是: Porsche
第2辆车是: BMW
第3辆车是: Volvo
简洁和清晰的层次结构是json格式的特点,有利于程序员的编写和阅读,同时也有利于计算机的解析和生成,提高了效率。
json在2005年-2006年正式成为主流的数据格式,正式替代了XML。
三、使用JSON实现序列化
JSON提供了dump和dumps方法,将一个对象进行序列化。
1、dumps
dumps方法的作用是把对象转换为字符串,它本身不具备将数据写入到文件的功能,如下样例:
import json
file = open('names.txt','w')
names = ['张三', '李四', '王五', '赵六', '赵露思', '徐真真']
# file.write(names) 执行出错,不能直接将列表对象写入文件
# 会报“write() argument must be str,not list”的错误
# 可以调用json的dumps方法,传入一个对象参数,将该参数转为字符串
result = json.dumps(names)
# dumps 方法得到的结果是一个字符串
print('dumps转换结果类型:', type(result))
# 然后就可以将字符串写入文件里
file.write(result)
file.close()
结果:
2、dump
dump方法的作用是把对象转换为字符串的同时,指定一个文件对象,然后将转换后的字符串写入到这个文件中。说白了,dump方法就是将上面两个操作:
result = json.dumps(names)
file.write(result)
合并为一个操作:
json.dump(names,file)
如下样例:
import json
file2 = open('names.txt', 'w')
nums = [123, 456, 789]
# 可以调用json的dump方法,将对象转为字符串的同时写入文件
json.dump(names, file2)
file2.close()
效果:
总结:所谓的JSON序列化,就是将对象转换为字符串,然后写入文件中。
三、使用JSON实现反序列化
顾名思义,反序列化就是将上面得到的JSON字符串,反向生成回一个Python对象。
如果我们直接从刚刚的文件中读取内容,不进行任何反序列化操作,我们看看结果如何:
file3 = open('names.txt', 'r')
content = file3.read()
print("读到的数据:", content)
print("读到数据类型:", type(content))
# 想去遍历其中的值,会被当做字符串一个一个字符遍历
i = 1
for item in content:
print(f"第{i}个值是:", item)
i += 1
file3.close()
结果:
可以看到,拿到的content不是之前的nums对象,而是一个字符串,因此不能像list列表对象一样去遍历内容。此时我们就需要将取出的content字符串序列化为Python的列表对象,这里我们使用到的方法是JSON的load和loads方法。
1、loads
loads方法的作用是把字符串转换为对象,它本身不具备将文件数据读取到python程序中的功能,如下样例:
file4 = open('names.txt', 'r')
content = file4.read()
print("转换前的数据:", content)
print("转换前的类型:", type(content))
result = json.loads(content)
print("转换后的数据:", result)
print("转换后的类型:", type(result))
i = 1
for item in result:
print(f"第{i}个值是:", item)
i += 1
file4.close()
效果:
转换前的数据: [123, 456, 789]
转换前的类型: <class 'str'>
转换后的数据: [123, 456, 789]
转换后的类型: <class 'list'>
第1个值是: 123
第2个值是: 456
第3个值是: 789
可以看到,转换前后的数据内容不变,数据类型发生了变化,并且支持list遍历了。
2、load
load方法的作用是将数据从文件中读取的同时,将读出的字符串转换为对象。说白了,load方法就是将上面两个操作:
content = file4.read()
result = json.loads(content)
合并为一个操作:
result = json.load(file4)
如下样例:
file5 = open('names.txt', 'r')
result = json.load(file5)
print("转换后的数据:", result)
print("转换后的类型:", type(result))
file5.close()
结果:
转换后的数据: [123, 456, 789]
转换后的类型: <class 'list'>
可以看到,load方法将数据直接读出来并转换为了python对象。
至此,有关Python文件读取及写入数据序列化和反序列化的操作讲解完毕,下一篇我们来学习Python中有关异常(捕获异常、处理异常等)的知识。
参考:尚硅谷Python爬虫教程小白零基础速通教学视频
转载请注明出处:https://blog.csdn.net/acmman/article/details/130543771