【Python从入门到进阶】18、文件内容序列化和反序列化操作

接上篇《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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值