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

news2024/11/26 0:42:06

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/499136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】 OpenSSH_7.4p1 升级到 OpenSSH_8.7p1(亲测无问题,建议收藏)

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录 文章声明前述安装一些必要的命令&…

MySQL数据库学习(进阶篇)

1.存储引擎 1.1 MySQL体系结构 连接层 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 第二层家口主要完成大多数的核心服务功能&#xff0c;如SQL接口…

二挡起步——pythonweb开发Django框架,前端原生+Django后端框架+python网络抓包(代替数据库数据)(附带小案例)

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

Java8新特性—Stream API

前言 Java 8引入了Stream API&#xff0c;这是一种新的API&#xff0c;可让开发人员更轻松地处理集合数据。 Stream API提供了丰富的操作&#xff0c;如过滤、映射、排序和规约。下面将对Stream API的基本语法、使用场景和示例进行介绍。 基本语法 Stream API是Java 8中处理…

玄子Share- Maven 3 安装配置教程(含安装包)

玄子Share- Maven 3 安装配置教程&#xff08;含安装包&#xff09; 下载 下载链接 官网 https://maven.apache.org/index.html 下载教程 进入 Maven 官网&#xff0c;点击左侧导航栏&#xff0c;Download下载。 下方选择安装类型&#xff0c;选择.zip后缀文件&#xff0c…

Linux系统通过Docker安装Elasticsearch、部署kibana

Docker安装和基本操作 一、安装Elasticsearch 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.拉取 docker pull elasticsearch:7.12.11.3.运行 运行docker命令…

8-3分治

引入 分治算法&#xff08;divide and conquer&#xff09;是五大常用算法(分治算法、动态规划算法、贪心算法、回溯法、分治界限法)之一。其实&#xff0c;很多人在平时学习中已经不知不觉就用到了分治算法&#xff0c;只是不知道那就是分治算法&#xff0c;今天&#xff0c;…

Word Embedding

One-hot-encoding 缺点 1.向量维度和向量个数很大&#xff0c;假设有1w个token的话&#xff0c;向量个数和维度就都是1w 2. 语义相近的词的向量并不相似 Word Embedding 核心思想&#xff1a;可以通过上下文理解单词的语义 predection-based方法 使用前一个单词预测下一个…

【前端】1、flex 布局详解

flex 布局目录 一、flex container 和 flex items二、用在 flex container 上的 CSS 属性(1) flex-direction(2) justify-content(3) align-items(4) flex-wrap(5) flex-flow(6) align-content 三、用在 flex items 上的 CSS 属性(1) order&#xff08;顺序&#xff09;(2) ali…

【Linux】Linux下的基本指令

&#x1f61b;作者&#xff1a;日出等日落 &#x1f4d8; 专栏&#xff1a;数据结构 人生就是这样&#xff0c;要耐的住寂寞&#xff0c;才守得住繁华。 —— 七堇年 目录 Linux的基本命令(常用)&#xff1a; ls 指令&#xff1a; pwd指…

告别混乱代码,这份 SpringBoot 后端接口规范太及时了

告别混乱代码&#xff0c;这份 SpringBoot 后端接口规范太及时了&#xff01; 文章目录 一、前言 二、环境说明 三、参数校验 1、介绍2、Validator 自动抛出异常&#xff08;使用&#xff09;3、分组校验和递归校验4、自定义校验 四、全局异常处理 1、基本使用2、自定义…

【Android入门到项目实战-- 9.4】—— 方向传感器的详细使用教程

目录 一、基础知识 二、实战使用 一、基础知识 Android的方向传感器&#xff0c;返回三轴的角度数据&#xff0c;方向数据的单位是角度。 提供三个数据&#xff1a;azimuth、pitch和roll。 azimuth&#xff1a;方位&#xff0c;返回水平时磁北极和Y轴的夹角&#xff0c;范围是…

Qt绘图(好玩)

release下的exe文件流畅度要远好于debug下的exe文件。 源码来源&#xff1a;基于Qt5模拟企业微信聊天界面(QWidget)_阿木大叔mu的博客-CSDN博客 初看时&#xff0c;觉得很神奇&#xff0c;猫眼会随着鼠标移动。 看完源码后&#xff0c;感觉很精美。 全是用painter画上去的&…

09_Uboot启动流程_1

目录 链接脚本u-boot.lds详解 U-Boot启动流程详解 reset函数源码详解 lowlevel_init函数详解 s_init函数详解 链接脚本u-boot.lds详解 要分析uboot的启动流程,首先要找到“入口”,找到第一行程序在哪里。程序的链接是由链接脚本来决定的,所以通过链接脚本可以找到程序的入…

【射影几何08】仿射映射

一、说明 简单来说&#xff0c;“仿射变换”就是&#xff1a;“线性变换”“平移”&#xff0c;但这是在笛卡尔坐标下的表现&#xff0c;然而在射影几何中&#xff0c;其中有更合乎逻辑的解释。本文讲仿射映射的定义&#xff0c;以及仿射不变性的特点。 二、仿射映射 2.1 直线…

2022 年全国硕士研究生入学统一考试英语(二)试题

2022年全国硕士研究生入学统一考试英语&#xff08;二&#xff09;试题 SectionⅠUse of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on the ANSWER SHEET. (10 points) Harlan Coben believes tha…

ChatGPT诞生的新岗位:提示工程师(Prompt Engineer)

ChatGPT诞生的新岗位&#xff1a;提示工程师&#xff08;Prompt Engineer&#xff09; Prompt 工程师是什么? 是识别人工智能的错误和隐藏功能&#xff0c;以便开发者可以对这些发现进行处理。 如果你正在寻找科技领域最热门的工作&#xff0c;你可以尝试了解如何与AI聊天机…

分布式文件存储系统Minio使用总结

分布式文件存储系统Minio使用总结 1.分布式文件系统应用: 1.1、Minlo 介绍&#xff1a; Minlo 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、…

一篇文章带你了解抖音来客功能的使用方法和注意事项

抖音是近年来备受欢迎的社交媒体平台之一&#xff0c;其中的“来客”功能更是让许多人喜爱。那么什么是抖音来客呢&#xff1f;抖音来客是指在直播过程中&#xff0c;可以邀请其他抖音用户进行互动和参与&#xff0c;从而增加直播的热度和粉丝数量。下面不若与众科技就来介绍一…

FPGA - 7系列 FPGA内部结构之CLB -03- CLB相关原语以及应用

前言 本文节选UG474的第二章&#xff0c;进行整理翻译。CLB资源被FPGA综合工具自动有效地使用&#xff0c;不需要任何特殊的FPGA专用编码。一些HDL编码建议和技术可以帮助优化设计以获得最大效率。 设计检查清单 这些指南是为有效使用7系列CLB的设计建议提供的快速核对表。7…